python 对图像椒盐噪声进行中值滤波,考虑边界0填充
1 import cv2 2 import numpy as np 3 4 # Read image 5 img = cv2.imread("F:\lena.jpg",0) 6 H, W= img.shape 7 8 9 imarray = np.array(img) 10 probility = 0.05 11 12 #添加椒盐噪声 13 for i in range(H): 14 for j in range(W): 15 if np.random.random(1) < probility: 16 if np.random.random(1) < 0.5: 17 imarray[i, j] = 0 18 else: 19 imarray[i, j] = 255 20 21 im_salt_pepper = imarray 22 23 cv2.imshow("salt&pepper noised",im_salt_pepper) 24 25 26 # 中值滤波模板 27 K_size = 3 28 29 # 进行0填充 30 pad = K_size // 2 31 32 out = np.zeros((H , W), dtype=np.float) 33 #print(out.shape) 34 out[pad:pad+H, pad:pad+W] = im_salt_pepper.copy().astype(np.float) 35 36 #4个边缘进行填充 37 out[0,1:H] = 0 38 out[H+1,1:H] = 0 39 out[1:H,0] = 0 40 out[1:H,H+1] = 0 41 42 #4个角进行填充 43 out[0,0] = out[H+1,H+1] = out[0,H+1]=out[H+1,0] = 0 44 tmp = out.copy() 45 46 for y in range(pad, H+pad): 47 for x in range(pad, W+pad): 48 out[y, x] = np.median(tmp[y-pad:y+pad, x-pad:x+pad]) 49 50 output = out[pad:pad+H, pad:pad+W].astype(np.uint8) 51 52 print("out shape is ",output.shape) 53 54 cv2.imshow("denoised", output) 55 cv2.imshow("original",img) 56 cv2.waitKey(0) 57 cv2.destroyAllWindows()
结果如下:
可以看到,中值滤波对于椒盐噪声去除效果还是比较好的。