目录
什么是图片平滑?
怎么做到图像平滑?
1.邻域平均法(又名均值滤波法)
2.中值滤波法
3.高斯滤波法
4.双边滤波法
目前,大多数数字图像系统中,输入光图像都是通过扫描方式将多维图像变成一维电信号,再对其进行存储、处理和传输等,最后形成多维图像信号。在这一系列复杂过程中,图像数字化设备、电气系统和外界影响将使得图像噪声的产生。——《数字图像处理》陈天华编著
所以图像平滑一般指消除图像中的噪音的过程。图像平滑也称图像模糊、图像去噪、机器去噪等。
回顾上节的图像增强概念思维导图,图像平滑采用空域滤波中的平滑滤波,也即是频域中的低通滤波。那么平滑滤波(即低通滤波)的几种方法如下:
①逻辑层面:对某一像素值及其邻域的所有像素值取平均值然后赋值给该像素值。
②实现层面:将图像与模板进行卷积运算。
④数学演示:
如第二行第二列计算过程:(6*1+1*1+9*1+1*1+5*1+8*1+9*1+8*1+0*1)/9=5.22,取整为5。
⑤程序演示,基于Python Opencv:
1.cv::blur():dst = cv.blur(src, ksize[, dst[, anchor[, borderType]]])
2.cv::boxFilter():dst = cv.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]])
normalize = 0(False)演示:
normalize = 1(True)演示:
3.cv::filter2D:dst = cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
尽管邻域平均法可以起到平滑图像的作用,但在消除噪音的同时,会使图像中的一部分细节变得模糊。中值滤波法则可以在消除噪音的同时保持图像的细节部分,防止图像的边缘部分变得模糊。
①逻辑层面:对某一像素而言,取周围n*n个数(也就是使用n*n模板)后取其中值作为新的像素值。
②实现层面:利用一个奇数点的移动窗口,将窗口中心值用窗口的中间值替代。
③程序演示,基于Python Opencv:
cv::medianBlur:dst = cv.medianBlur(src, ksize[, dst])
高斯滤波法对于去除图像中的高斯噪声非常有效。
①逻辑层面:高斯滤波其实是一种带权重的均值滤波。权重参数是由高斯函数计算出来的。
公式中的σ为标准差。
所以由二维高斯图像可得中间像素值的权重占比最大(锚点为极值),后所有方向上依次权重减小。
②实现层面:使用高斯核在图像的每个像素点上平滑移动进行卷积运算。
③程序演示,基于Python Opencv:
cv::GaussianBlur:dst = cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
双边滤波法在去除噪声的同时对保持边缘(边缘和噪音都是高频)清晰锐利非常有效,但是速度慢。
①逻辑层面:按照高斯滤波法考虑距离设置权重,同时又考虑两边值差,如果两边值差过大则结果只算自己一边的权重均值。
②实现层面:双边滤波器考虑了像素点之间的欧式距离(使用二维高斯函数生成距离模板),也考虑了像素点之间的颜色差异(使用一维高斯函数生成值域模板)。
1.距离模板系数的生成公式如下:
其中(k,l)为模板窗口的中心坐标;(i,j)为模板窗口的其他系数的坐标;σd为高斯函数的标准差。使用该公式生成的滤波器模板和高斯滤波器使用的模板是没有区别的。
2.值域模板系数的生成公式如下:
其中f(x,y)表示图像在点(x,y)处的像素值;(k,l)为模板窗口的中心坐标;(i,j)为模板窗口的其他系数的坐标;σr为高斯函数的标准差。
3.将上述两个模板相乘就得到了双边滤波器的模板:
来源:https://www.cnblogs.com/wangguchangqing/p/6416401.html
模板可视化:
③ 程序演示,基于Python Opencv:
cv::bilateralFilter():dst = cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
参考文档:
opencv官方文档