自适应中值滤波器的基本原理:
Zxy:图像中第x行第y列个像素点的灰度值;
Sxy:滤波器窗口,该区域中心点为图像中第y行第x列个像素点;
Zmin:Sxy中最小的灰度值;
Zmax:Sxy中最大的灰度值;
Zmed:Sxy中所有灰度值的中值;
Smax:Sxy所允许的最大窗口尺寸;
自适应中值滤波器分为以下两个层次:
A:
A1 = Zmed-Zmin
A2 = Zmed-Zmax
如果A1>0且 A2<0,则跳转到B
否则,增大窗口的尺寸
如果增大后的尺寸≤Smax,则重复A
否则,直接输出Zmed
B:
B1 = Zxy-Zmin
B2 = Zxy-Zmax
如果B1>0且 B2<0,则输出Zxy
否则输出Zmed
自适应中值滤波器对椒盐噪声处理的效果好,所以先对图像进行了椒盐噪声处理再使用自适应中值滤波算法。
import cv2 as cv
import numpy as np
#将彩色图片转换为灰度图片并添加椒盐噪声
def AddNoise(path,probility):
image = cv.imread(path, 0) # 直接以灰度图片读取
cv.imwrite('gray.jpg', image) # 保存灰度的图片
height,width=image.shape[:2]
for i in range (height):
for j in range (width):
if np.random.random(1) Zmin) and (Zmed < Zmax): #A层次
if (Zxy > Zmin) and (Zxy < Zmax): #转到B层次
return Zxy
else:
return Zmed
else:
filter_size = filter_size + 1 #增大窗口尺寸再进行判断
if filter_size <= Smax:
return auto_deal(src, i, j, filter_size, Smax)
else: #窗口尺寸过大返回中值
return Zmed
def auto_med_filter(img, Smin, Smax):
borderSize = Smax
src = cv.copyMakeBorder(img, borderSize, borderSize, borderSize, borderSize, cv.BORDER_REFLECT)
#寻找图像上的每一个像素点
for m in range(borderSize, src.shape[0] - borderSize):
for n in range(borderSize, src.shape[1] - borderSize):
src[m,n] = auto_deal(src, m, n, Smin, Smax)
img1 = src[borderSize:borderSize+img.shape[0], borderSize:borderSize+img.shape[1]]
return img1
if __name__ == '__main__':
img=AddNoise('img1.jpg', 0.4)
img_auto_filter = auto_med_filter(img, 2,7)
cv.imwrite('img1_auto_filter.jpg', img_auto_filter)