灰度图添加椒盐噪声并中值模糊后显示为绿色的问题排查
问题排查与解决
核心显示问题:灰度图变绿色
plt.imshow默认会将单通道数组用伪彩色colormap(默认是viridis,偏绿色)渲染,哪怕是灰度图也会触发这个逻辑。解决方法直接在显示时指定灰度配色规则:
plt.imshow(median_blur, cmap='gray', vmin=0, vmax=255) plt.show()
cmap='gray':强制使用灰度色阶映射vmin=0, vmax=255:固定像素值对应范围,避免自动缩放导致灰度偏差
其他代码问题修正
- 中值模糊对象错误
你当前代码里medianBlur处理的是原始灰度图img1,而非加了椒盐噪声的img_con_sp_1,需修正为:
median_blur = cv.medianBlur(img_con_sp_1, 7)
- 椒盐噪声逻辑问题
- 代码中
pixel变量未定义,直接删除即可 - 当前噪声概率逻辑混乱,
rdn随机值导致噪声比例不稳定,改成固定概率的实现更合理:
也可以用numpy向量化操作替代循环,大幅提升效率:import random import numpy as np import cv2 as cv import matplotlib.pyplot as plt img1 = cv.imread('foto_1.jpeg', cv.IMREAD_GRAYSCALE) img_con_sp_1 = img1.copy() prob = 0.02 # 调整噪声比例,0.00001几乎看不到噪声 x, y = img1.shape for i in range(x): for j in range(y): rdn = random.random() if rdn < prob / 2: img_con_sp_1[i][j] = 0 # 椒噪声(黑色) elif rdn < prob: img_con_sp_1[i][j] = 255 # 盐噪声(白色) # 其余情况保留原像素prob = 0.02 mask = np.random.rand(*img1.shape) < prob img_con_sp_1 = img1.copy() # 随机分配椒/盐噪声 img_con_sp_1[mask] = np.where(np.random.rand(np.sum(mask)) < 0.5, 0, 255)
- 自定义imshow函数的潜在问题
你使用的imshow("imagen con S&P 1", img_con_sp_1, size=12)如果是自定义函数,需确保它处理单通道图像时也采用灰度显示规则,否则噪声图预览也会出现颜色异常。
内容的提问来源于stack exchange,提问作者Luis Enrique Garduno Morales
相关产品推荐
相关产品推荐

