中值滤波:将n*n范围内像素点排序,选择其中值的灰度值来代替中间的灰度值
如:以3*3的领域为例求中值滤波中像素5的值
1)int pixel[9]中存储像素1,像素2...像素9的值;
2)对数组pixel[9]进行排序操作;
3)像素5的值即为数组pixel[9]的中值pixel[4]。中值滤波对处理椒盐噪声非常有效。
均值滤波:就是以n*n范围内的像素平均值代替中间像素值。
![](https://i-blog.csdnimg.cn/blog_migrate/f04c12ebb619fc6ce37e4f2b121a8b16.png)
像素1的值则为sum(1...9)/9
中值滤波OpenCV代码:
import cv2
import numpy as np
def salt(img,n):
for k in range(n):
i = int(np.random.random()*img.shape[1])
j = int(np.random.random()*img.shape[0])
if img.ndim == 2:
img[j,i] = 255
elif img.ndim == 3:
img[j,i,0] = 255
img[j,i,1] = 255
img[j,i,2] = 255
return img
def nosalt(img,n):
for k in range(n):
i = int(np.random.random()*img.shape[1])
j = int(np.random.random()*img.shape[0])
if img.ndim == 2:
img[j,i] = 0
elif img.ndim == 3:
img[j,i,0] = 0
img[j,i,1] = 0
img[j,i,2] = 0
return img
if __name__=='__main__':
path = 'E:/zhz/'
img = cv2.imread(path+"lena.jpg",0)
SNR = 0.9
noiseNum = int((1-SNR)*img.shape[0]*img.shape[1])
saltImg = salt(img,noiseNum)
saltImg = nosalt(saltImg,noiseNum)
denoise3 = cv2.medianBlur(saltImg,3)
denoise5 = cv2.medianBlur(saltImg,5)
cv2.imshow("salt",saltImg)
cv2.imshow("denoise3",denoise5)
cv2.imwrite(path+"salt_lena.jpg",saltImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
中值滤波PIL代码:
import cv2
import numpy as np
def salt(img,n):
for k in range(n):
i = int(np.random.random()*img.shape[1])
j = int(np.random.random()*img.shape[0])
if img.ndim == 2:
img[j,i] = 255
elif img.ndim == 3:
img[j,i,0] = 255
img[j,i,1] = 255
img[j,i,2] = 255
return img
def nosalt(img,n):
for k in range(n):
i = int(np.random.random()*img.shape[1])
j = int(np.random.random()*img.shape[0])
if img.ndim == 2:
img[j,i] = 0
elif img.ndim == 3:
img[j,i,0] = 0
img[j,i,1] = 0
img[j,i,2] = 0
return img
def preFilter(img,n,x,y):
sum_s = []
for k in range(-int(n/2),int(n/2)+1):
for m in range(-int(n/2),int(n/2)+1):
sum_s.append(img[x+k,y+k])
sum_s.sort()
return sum_s[int((n*n/2)+1)]
def mediumFilter(img,n):
resultImg = np.zeros((img.shape[0],img.shape[1]),dtype=img.dtype)
for i in range(int(n/2),img.shape[0]-int(n/2)):
for j in range(int(n/2),img.shape[1]-int(n/2)):
resultImg[i,j] = preFilter(img,n,i,j)
return resultImg
if __name__=='__main__':
path = 'E:/zhz/'
img = cv2.imread(path+"lena.jpg",0)
SNR = 0.9
noiseNum = int((1-SNR)*img.shape[0]*img.shape[1])
saltImg = salt(img,noiseNum)
saltImg = nosalt(saltImg,noiseNum)
denoise3 = mediumFilter(saltImg,5)
#cvdenoise3 = cv2.medianBlur(saltImg,3)
#denoise5 = cv2.medianBlur(saltImg,5)
cv2.imshow("salt",saltImg)
#cv2.imshow("cvdenoise3",cvdenoise3)
cv2.imshow("denoise3",denoise3)
cv2.imwrite(path+"salt_lena.jpg",saltImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
均值滤波: