1.中值滤波器
中值滤波器属于非线性滤波器,中值滤波是对整幅图像求解中位数的过程。具体实现时用一个模板扫描图像中的每一个像素,然后用模板范围内所有像素的中位数像素代替原来模板中心的像素。例如下图中图像中间150灰度的像素在中值滤波后灰度将会赋值为124.
中值滤波器现起来比较容易,可以调用opencv-python中的库函数也可以自己编写相关函数,中值滤波器相关函数主体如下
import cv2 as cv import matplotlib.pyplot as plt import math import numpy as np def get_median(data): data.sort() half = len(data) // 2 return data[half] # 计算灰度图像的中值滤波 def my_median_blur_gray(image, size): data = [] sizepart = int(size/2) for i in range(image.shape[0]): for j in range(image.shape[1]): for ii in range(size): for jj in range(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=[] return image # 计算彩色图像的中值滤波 def my_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)) return result if __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()
中值滤波器滤波效果为
2.高斯滤波器
扫描二维码关注公众号,回复:
10191465 查看本文章
高斯滤波是一种线性平滑滤波,和均值滤波计算方法相似,但是其模板中心像素的权重要大于邻接像素的权重。具体的数值比例关系按照下面的二元高斯函数进行计算。
比如要产生一个下图3×3的模板,可以将模板中像素坐标带入高斯函数中得到关于σ的模板矩阵。
若去σ值为0.85,计算矩阵个元素数值,再将左上角的数值归一化的矩阵为
将此矩阵取整即可得到图像处理的一个模板
当然,去σ为不同的数值可以得到不同的模板。高斯滤波可以有效地去除高斯噪声,由于很多图片都具有高斯噪声,所以高斯滤波在图像图例上用得很广。
高斯滤波器自定义函数主体为
import cv2 as cv import matplotlib.pyplot as plt import math import numpy as np # 高斯滤波函数 def my_function_gaussion(x, y, sigma): return math.exp(-(x**2 + y**2) / (2*sigma**2)) / (2*math.pi*sigma**2) # 产生高斯滤波矩阵 def my_get_gaussion_blur_retric(size, sigma): n = size // 2 blur_retric = np.zeros([size, size]) # 根据尺寸和sigma值计算高斯矩阵 for i in range(size): for j in range(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) # 返回高斯矩阵 return blur_retric # 计算灰度图像的高斯滤波 def my_gaussion_blur_gray(image, size, sigma): blur_retric = my_get_gaussion_blur_retric(size, sigma) n = blur_retric.sum() sizepart = size // 2 data = 0 # 计算每个像素点在经过高斯模板变换后的值 for i in range(image.shape[0]): for j in range(image.shape[1]): for ii in range(size): for jj in range(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 # 返回变换后的图像矩阵 return image # 计算彩色图像的高斯滤波 def my_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)) return result if __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高斯滤波器滤波效果为