图像运算和图像增强八
图像平滑之中值滤波、双边滤波 (非线性滤波)
(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]])
- d 表示在过滤期间使用的每个像素邻域的直径。如果这个值我们设其为非正数,则它会由 sigmaSpace 计算得出
- sigmaColor 表示颜色空间的标准方差。该值越大,表明像素邻域内较远的颜色会混合在一起,从而产生更大面积的半相等颜色区域
- sigmaSpace 表示坐标空间的标准方差。该值越大,表明像素的颜色足够接近,从而使得越远的像素会相互影响,更大的区域中相似的颜色获取相同的颜色,当 d>0,d 指定了邻域大小且与 sigmaSpace 无关。否则,d 正比于 sigmaSpace
- borderType 表示边框模式,用于推断图像外部像素的某种边界模式,默认值为 BORDER_DEFAULT,可省略
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()
转载:https://blog.csdn.net/come_closer/article/details/127835358
查看评论