1.中值滤波器

中值滤波器属于非线性滤波器,中值滤波是对整幅图像求解中位数的过程。具体实现时用一个模板扫描图像中的每一个像素,然后用模板范围内所有像素的中位数像素代替原来模板中心的像素。例如下图中图像中间150灰度的像素在中值滤波后灰度将会赋值为124.

pythondui NR 频域数据过滤波器 python滤波器函数_python低通滤波函数

中值滤波器现起来比较容易,可以调用opencv-python中的库函数也可以自己编写相关函数,中值滤波器相关函数主体如下

importcv2 as cvimportmatplotlib.pyplot as pltimportmathimportnumpy as npdefget_median(data):
data.sort()
half= len(data) // 2
returndata[half]#计算灰度图像的中值滤波
defmy_median_blur_gray(image, size):
data=[]
sizepart= int(size/2)for i inrange(image.shape[0]):for j in range(image.shape[1]):for ii inrange(size):for jj inrange(size):#首先判断所以是否超出范围,也可以事先对图像进行零填充
if (i+ii-sizepart)<0 or (i+ii-sizepart)>=image.shape[0]:pass
elif (j+jj-sizepart)<0 or (j+jj-sizepart)>=image.shape[1]:pass
else:
data.append(image[i+ii-sizepart][j+jj-sizepart])#取每个区域内的中位数
image[i][j] =int(get_median(data))
data=[]returnimage#计算彩色图像的中值滤波
defmy_median_blur_RGB(image, size):
(b ,r, g)=cv.split(image)
blur_b=my_median_blur_gray(b, size)
blur_r=my_median_blur_gray(r, size)
blur_g=my_median_blur_gray(g, size)
result=cv.merge((blur_b, blur_r, blur_g))returnresultif __name__ == '__main__':
image_test1= cv.imread('test1.pgm')#调用自定义函数
my_image_blur_median = my_median_blur_RGB(image_test1, 5)#调用库函数
computer_image_blur_median = cv.medianBlur(image_test1, 5)
fig=plt.figure()
fig.add_subplot(131)
plt.title('original')
plt.imshow(image_test1)
fig.add_subplot(132)
plt.title('my median')
plt.imshow(my_image_blur_median)
fig.add_subplot(133)
plt.title('library median')
plt.imshow(computer_image_blur_median)
plt.show()

中值滤波器滤波效果为

pythondui NR 频域数据过滤波器 python滤波器函数_中值滤波器_02

2.高斯滤波器

高斯滤波是一种线性平滑滤波,和均值滤波计算方法相似,但是其模板中心像素的权重要大于邻接像素的权重。具体的数值比例关系按照下面的二元高斯函数进行计算。

pythondui NR 频域数据过滤波器 python滤波器函数_中值滤波_03

比如要产生一个下图3×3的模板,可以将模板中像素坐标带入高斯函数中得到关于σ的模板矩阵。

pythondui NR 频域数据过滤波器 python滤波器函数_中值滤波_04

pythondui NR 频域数据过滤波器 python滤波器函数_中值滤波_05

若去σ值为0.85,计算矩阵个元素数值,再将左上角的数值归一化的矩阵为

pythondui NR 频域数据过滤波器 python滤波器函数_中值滤波_06

将此矩阵取整即可得到图像处理的一个模板

pythondui NR 频域数据过滤波器 python滤波器函数_中值滤波_07

当然,去σ为不同的数值可以得到不同的模板。高斯滤波可以有效地去除高斯噪声,由于很多图片都具有高斯噪声,所以高斯滤波在图像图例上用得很广。

高斯滤波器自定义函数主体为

importcv2 as cvimportmatplotlib.pyplot as pltimportmathimportnumpy as np#高斯滤波函数
defmy_function_gaussion(x, y, sigma):return math.exp(-(x**2 + y**2) / (2*sigma**2)) / (2*math.pi*sigma**2)#产生高斯滤波矩阵
defmy_get_gaussion_blur_retric(size, sigma):
n= size // 2blur_retric=np.zeros([size, size])#根据尺寸和sigma值计算高斯矩阵
for i inrange(size):for j inrange(size):
blur_retric[i][j]= my_function_gaussion(i-n, j-n, sigma)#将高斯矩阵归一化
blur_retric = blur_retric /blur_retric[0][0]#将高斯矩阵转换为整数
blur_retric =blur_retric.astype(np.uint32)#返回高斯矩阵
returnblur_retric#计算灰度图像的高斯滤波
defmy_gaussion_blur_gray(image, size, sigma):
blur_retric=my_get_gaussion_blur_retric(size, sigma)
n=blur_retric.sum()
sizepart= size // 2data=0#计算每个像素点在经过高斯模板变换后的值
for i inrange(image.shape[0]):for j in range(image.shape[1]):for ii inrange(size):for jj inrange(size):#条件语句为判断模板对应的值是否超出边界
if (i+ii-sizepart)<0 or (i+ii-sizepart)>=image.shape[0]:pass
elif (j+jj-sizepart)<0 or (j+jj-sizepart)>=image.shape[1]:pass
else:
data+= image[i+ii-sizepart][j+jj-sizepart] *blur_retric[ii][jj]
image[i][j]= data /n
data=0#返回变换后的图像矩阵
returnimage#计算彩色图像的高斯滤波
defmy_gaussion_blur_RGB(image, size, sigma):
(b ,r, g)=cv.split(image)
blur_b=my_gaussion_blur_gray(b, size, sigma)
blur_r=my_gaussion_blur_gray(r, size, sigma)
blur_g=my_gaussion_blur_gray(g, size, sigma)
result=cv.merge((blur_b, blur_r, blur_g))returnresultif __name__ == '__main__':
image_test1= cv.imread('test1.pgm')#进行高斯滤波器比较
my_image_blur_gaussion = my.my_gaussion_blur_RGB(image_test1, 5, 0.8)
computer_image_blur_gaussion= cv.GaussianBlur(image_test1, (5, 5), 0.8)
fig=plt.figure()
fig.add_subplot(131)
plt.title('original')
plt.imshow(image_test1)
fig.add_subplot(132)
plt.title('my gaussion')
plt.imshow(my_image_blur_gaussion)
fig.add_subplot(133)
plt.title('library gaussion')
plt.imshow(computer_image_blur_gaussion)
plt.show()

5×5高斯滤波器滤波效果为

pythondui NR 频域数据过滤波器 python滤波器函数_中值滤波器_08