理论参考《学习opencv3》第10章滤波与卷积
平滑也称为“模糊”,平滑图像的目的有很多,但通常都是为了减少噪声和伪影,在降低图像分辨率的时候,平滑也是十分重要。
Opencv中总共有四种图像模糊技术
一 均匀
涉及函数
cv.blur() cv.boxFilter()
由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平均值来代替中心元素。均匀滤波对噪声敏感。
如果你想使用归一化卷积框可以使用cv2.boxFilter()时加入参数normalize=False。
二 中值模糊
涉及函数
cv.medianBlur()
就是用与卷积框对应像素的中值来替代中心像素的值,这个滤波器经常用来去除高斯噪声。前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围或者本身的值来取代他,他能有效去除噪声。卷积核的大小也应该是一个奇数。
三 高斯模糊
涉及函数
cv.GaussianBlur()
现在把卷积核换成高斯核,简单的说方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包,原来的求平均数变成求加权平均数,权就是方框里的值。实现的函数是cv2.GaussianBlur()。需要指定高斯核的宽和高(必须是奇数),以及高斯函数沿X,Y方向的标准差。如果我们只指定了X方向的标准差,Y方向也会取相同值,如果两个标准差都是0.那么函数会根据核函数的大小自己计算,高斯滤波可以有效的从图像中去除高斯噪音。也可以使用cv2.getGaussianKernel()自己构建一个高斯核。
四 双边滤波
涉及函数
cv.bilateralFilter()
函数cv2.bilateralFilter()能在保持边界清晰的情况下有效的去除噪音,但比较慢。高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度),所以这种方法不会考虑一个像素是否位于边界,因此边界也会被模糊掉。
双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以能保证边界不会被模糊,因此边界处的灰度值变化比较大。
python 代码
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
%matplotlib qt5
#通道转换函数,用plt 显示opencv读取的图像
def bgr2rgb(img):
h,w,c = img.shape
b,g,r = cv.split(img)
img_rgb=cv.merge([r,g,b])
return img_rgb
img = cv.imread("E:\\opencv2020\\picture\\wenli.jpg")
blur = cv.blur(img,(5,5))
gaussian = cv.GaussianBlur(img,(7,7),0)
median = cv.medianBlur(img,5)
bilateral = cv.bilateralFilter(img,7,125,125)
imgs=[img,blur,gaussian,median,bilateral]
imgs = [bgr2rgb(img) for img in imgs]
titles= ["input","blur","Gaussian","median","bilateral"]
for i in range(5):
plt.subplot(2,3,i+1)
plt.imshow(imgs[i])
plt.title([titles[i]])
plt.xticks([])
plt.yticks([])
plt.show()
输出图像: