(1)中值滤波
中值滤波通过计算每一个像素点某邻域范围内所有像素点灰度值的中值,来替换该像素点的灰度值,从而让周围的像素值更接近真实情况,消除孤立的噪声。
中值滤波算法的计算过程如图,选择含有五个点的窗口,依次扫描该窗口中的像素,每个像素点所对应的灰度值按照升序或降序排列,然后获取最中间的值来替换该点的灰度值。
dst = medianBlur(src, ksize[, dst])
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img=cv2.imread('lena-zs.png')
source=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#中值滤波
result = cv2.medianBlur(source, 3) #内核为3,内核数为奇数
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图形
titles = ['原始图像', '中值滤波']
images = [source, result]
for i in range(2):
plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
(2)双边滤波
双边滤波比高斯滤波多了一个高斯方差 sigma-d,它是基于空间分布的高斯滤波函数。所以在图像边缘附近,离的较远的像素点不会过于影响到图像边缘上的像素点,从而保证了图像边缘附近的像素值得以保存,不会使图片有较明显的边缘模糊。
dst = bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[,
borderType]])
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img=cv2.imread('lena-zs.png')
source=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#双边滤波
result=cv2.bilateralFilter(source,15,150,150)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图形
titles=['原始图像','双边滤波']
images=[source,result]
for i in range(2):
plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()