You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

灰度图添加椒盐噪声并中值模糊后显示为绿色的问题排查

问题排查与解决

核心显示问题:灰度图变绿色

plt.imshow默认会将单通道数组用伪彩色colormap(默认是viridis,偏绿色)渲染,哪怕是灰度图也会触发这个逻辑。解决方法直接在显示时指定灰度配色规则:

plt.imshow(median_blur, cmap='gray', vmin=0, vmax=255)
plt.show()
  • cmap='gray':强制使用灰度色阶映射
  • vmin=0, vmax=255:固定像素值对应范围,避免自动缩放导致灰度偏差

其他代码问题修正

  1. 中值模糊对象错误
    你当前代码里medianBlur处理的是原始灰度图img1,而非加了椒盐噪声的img_con_sp_1,需修正为:
median_blur = cv.medianBlur(img_con_sp_1, 7)
  1. 椒盐噪声逻辑问题
  • 代码中pixel变量未定义,直接删除即可
  • 当前噪声概率逻辑混乱,rdn随机值导致噪声比例不稳定,改成固定概率的实现更合理:
    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  # 盐噪声(白色)
            # 其余情况保留原像素
    
    也可以用numpy向量化操作替代循环,大幅提升效率:
    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)
    
  1. 自定义imshow函数的潜在问题
    你使用的imshow("imagen con S&P 1", img_con_sp_1, size=12)如果是自定义函数,需确保它处理单通道图像时也采用灰度显示规则,否则噪声图预览也会出现颜色异常。

内容的提问来源于stack exchange,提问作者Luis Enrique Garduno Morales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:22:10