# 双边滤波BilateralFilters
# 1.高斯滤波
# 1.1 理论
高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小。
二维高斯函数表达式:
卷积核大小
其中
取
对于卷积核大小为
高斯核主要用来对图像做平滑。
# 1.2 示例
OpenCV
中有GaussianBlur
的API
函数,调用时只需给出kernel size
和sigma
即可。
cv::Mat dst;
cv::GaussianBlur(img, dst, cv::Size(7, 7), 0.9);
cv::imshow("Before Gaussian Blur", img);
cv::imshow("After Gaussian Blur", dst);
cv::waitKey(0);
上图中,可以看到平滑后红框中的帽子边沿变模糊了。
# 2.双边滤波(Bilateral Filter)
# 2.1 理论基础
第一部分介绍的高斯滤波在对图像进行平滑操时,对所有的像素都是无差别的使用同个高斯核进行计算的,这会导致对图像中物体边缘也进行平滑,使图像变的模糊。
为了解决高斯滤波会导致边缘模糊的问题,不仅需要考虑像素之间的空间关系,还需要考虑卷积核范围内的像素值间的变化大小。对像素值变化大的位置,考虑有可能是边缘,增大该位置的权重。
回顾一下,高斯模糊的公式为:
其中Gaussian Blur
后的结果,
双边滤波算法Bilateral Filter
不仅考虑了位置,还考虑了像素值的变化,因此双边滤波的公式为:
其中Bilateral Filter
后的结果,
上面这幅图中,23x23
的双边滤波的核,图
# 2.2 OpenCV bilateralFilter函数
cv::Mat dstb, dstg;
cv::GaussianBlur(img, dstg, cv::Size(3,3), 0.8);
cv::bilateralFilter(img, dstb, -1, 75, 0.8);
cv::imshow("Origin", img);
cv::imshow("After Gaussian Blur", dstg);
cv::imshow("After Bilateral Filter", dstb);
cv::waitKey(0);
效果对比如下:
点开图像看原图,在图中红色框出的部分,能够看到双边滤波在平滑的同时还有非常好的保边能力。
# 参考资料
单应矩阵 →