OpenCV双边滤波详解及实代码实现

双边滤波(Bilateral Filter)是非线性滤波中的一种。这是一种结合图像的空间邻近度与像素值相似度的处理办法。在滤波时,该滤波方法同时考虑空间临近信息与颜色相似信息,在滤除噪声、平滑图像的同时,又做到边缘保存。

双边滤波采用了两个高斯滤波的结合。一个负责计算空间邻近度的权值,也就是常用的高斯滤波器原理。而另一个负责计算像素值相似度的权值。在两个高斯滤波的同时作用下,就是双边滤波。

如果对于高斯滤波(空间邻近)原理不清晰的,建议先阅读这两篇文章
OpenCV高斯滤波器详解及代码实现
快速高斯滤波、高斯模糊、高斯平滑(二维卷积分步为一维卷积)

看到这里,博主认为你对高斯滤波(空间临近)已经理解并掌握了,那么我们开始对双边滤波进行讲解。
在上面两篇文章中提到,高斯滤波(空间临近)是将二维高斯正态分布放在图像矩阵上做卷积运算。考虑的是邻域内像素值的空间距离关系。通过在核大小范围内,各个点到中心点的空间临近度计算出对应的权值,并将计算好的核与图像矩阵作卷积。最后,图像经过滤波后达到平滑的效果,而图像上的边缘也会有一定程度的平滑,使得整个图像变得模糊,边缘得不到保存。

双边滤波的基本思想是:将高斯滤波(空间临近)的原理中,通过各个点到中心点的空间临近度计算的各个权值进行优化,将其优化为空间临近度计算的权值 和 像素值相似度计算的权值的乘积,优化后的权值再与图像作卷积运算。从而达到保边去噪的效果。


此时可以看到,这明显是图像矩阵与核的卷积运算了。其中m1/M代表的第一个点(或最后一个点,看后面如何实现)的权值,而图像矩阵与核通过卷积算子作加权和,最终得到输出值。

接下来我们来讨论最关键的w(i, j, k, l)
ws为空间临近高斯函数,wr为像素值相似度高斯函数

 

int main(void)
{
// [1] src读入图片
cv::Mat src = cv::imread("pic3.jpg");
// [2] dst目标图片
cv::Mat dst;
// [3] 滤波 N越大越平越模糊(2*N+1) sigmas空间越大越模糊sigmar相似因子
myBialteralFilter(&src, &dst, 25, 12.5, 50);
// [4] 窗体显示
cv::imshow("src 1006534767", src);
cv::imshow("dst 1006534767", dst);
cv::waitKey(0);
cv::destroyAllWindows();

return 0;
}
————————————————
版权声明:本文为CSDN博主「青城山小和尚」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36359022/article/details/80198890



版权声明:本文为CSDN博主「青城山小和尚」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36359022/article/details/80198890

posted @   高桥、凉介  阅读(557)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示