对含椒盐噪声图像执行中值滤波后变紫色,求错误原因
中值滤波后图像变紫色的问题排查
我给图像加了椒盐噪声后用2D中值滤波去噪,结果处理完图像变成了紫色:

使用的代码如下:
import math import numpy as np import matplotlib.pyplot as plt # 假设image是读入的RGB图像 M=3; N=3; modifyA=np.pad(image, [(math.floor(M/2),math.floor(N/2))]) B = np.zeros([(image.shape[0]),(image.shape[1])]) med_indx = round((M*N)/2); #MEDIAN INDEX for i in range ((modifyA.shape[0])-(M-1)-1): for j in range ((modifyA.shape[1])-(N-1)-1): temp = modifyA[i:i+(M-1), j:j+(N-1)] # #RED,GREEN AND BLUE CHANNELS ARE TRAVERSED SEPARATELY for k in range (2): tmp = temp[:,:,k] B[i,j] = np.median(tmp[:]) B = B.astype(np.uint8) imgplot = plt.imshow(B) plt.show()
错误点分析
- 输出数组维度不匹配:你创建的
B是二维单通道数组,但原始RGB图像是三维(高×宽×3)。plt.imshow显示单通道数组时会默认使用伪彩色映射(比如viridis),这就是图像变紫色的直接原因。 - 通道遍历不完整且赋值错误:
for k in range(2)只遍历了红、绿两个通道(索引0和1),漏掉了蓝色通道(索引2);而且三个通道的中值结果都被写到了同一个单通道B里,完全打乱了颜色信息。 - 滤波窗口大小错误:
temp = modifyA[i:i+(M-1), j:j+(N-1)]取的是2×2的窗口(因为M=3,M-1=2),但你要做的是3×3中值滤波,应该取i:i+M, j:j+N。 - 图像填充不完整:
np.pad只对前两个维度做了填充,没有处理通道维度,需要加上[(0,0)]来保持通道数一致,避免维度异常。
修正后的代码
import math import numpy as np import matplotlib.pyplot as plt # 假设image是读入的RGB图像(shape为H×W×3) M = 3 N = 3 # 对三个维度都做填充,前两个维度填充1行/列(因为M//2=1),通道维度不填充 pad_size = math.floor(M/2) modifyA = np.pad(image, [(pad_size, pad_size), (pad_size, pad_size), (0, 0)], mode='constant') # 创建和原始图像同维度的输出数组(H×W×3) B = np.zeros_like(image) for i in range(image.shape[0]): for j in range(image.shape[1]): # 取3×3的窗口 temp = modifyA[i:i+M, j:j+N] # 遍历三个颜色通道分别做中值滤波 for k in range(3): tmp = temp[:, :, k] B[i, j, k] = np.median(tmp) B = B.astype(np.uint8) plt.imshow(B) plt.show()
另外,也可以用更高效的现成函数实现:
import cv2 denoised_img = cv2.medianBlur(image, 3) plt.imshow(denoised_img) plt.show()
内容的提问来源于stack exchange,提问作者Halit Turan
相关产品推荐
相关产品推荐

