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()
結果如下:
可以看到,中值濾波對於椒鹽噪聲去除效果還是比較好的。