OPenCV学习笔记之六——非线性滤波(中值滤波,双边滤波)
方框滤波:应用3x3的方框滤波器,效果较为平滑,但细节丢失较多。 均值滤波:使用3x3均值滤波器,图像较平滑,但细节模糊明显。 高斯滤波:应用3x3高斯滤波器,效果与均值滤波相似,但稍微平滑一些。 中值滤波:应用3x3中值滤波器,去噪效果显著,细节保留较好。 双边滤波:应用3x3双边滤波器,既平滑又保留边缘,效果最优。
发布日期:2025-06-18 15:55:18
浏览次数:4
分类:精选文章
本文共 4421 字,大约阅读时间需要 14 分钟。
中值滤波与双边滤波的应用与实现
在图像处理领域,中值滤波和双边滤波是两种常用的去噪和保边方法。以下是对这两种滤波器的详细介绍及其实现代码。
中值滤波——medianBlur函数
中值滤波是一种非线性滤波技术,它通过取像素点邻域内灰度值的中值来替代原像素点的灰度值。这种方法在去除脉冲噪声和椒盐噪声的同时,能够有效地保留图像的边缘细节。与均值滤波相比,中值滤波不易受到噪声的影响,因此在去噪方面表现优于均值滤波,但计算复杂度较高。
代码实现
以下是使用OpenCV实现中值滤波的代码示例:
#include#include #include #include using namespace std;using namespace cv;Mat Img_in , Img_out1, Img_out2,Img_out3,Img_out4,Img_out5;void callback_box(int ,void*){ if (kernel_box%2 ==0) kernel_box=kernel_box+1; boxFilter(Img_in,Img_out1,-1,Size(kernel_box,kernel_box)); imshow("【方框滤波】",Img_out1);}void callback_mean(int ,void*){ if (kernel_mean%2 ==0) kernel_mean=kernel_mean+1; blur(Img_in,Img_out2,Size(kernel_mean,kernel_mean)); imshow("【均值滤波】", Img_out2);}void callback_gaussian(int ,void*){ if (kernel_gaussian%2 ==0) kernel_gaussian=kernel_gaussian+1; GaussianBlur(Img_in,Img_out3,Size(kernel_gaussian*2+1 , kernel_gaussian*2+1),0,0); imshow("【高斯滤波】",Img_out3);}void callback_median(int ,void*){ if (kernel_median%2 ==0) kernel_median=kernel_median+1; medianBlur(Img_in,Img_out4,kernel_median*2+1); imshow("【中值滤波】",Img_out4);}void callback_bilateral(int ,void*){ bilateralFilter(Img_in , Img_out5,kernel_bilateral,kernel_bilateral*2,kernel_bilateral/2); imshow("【双边滤波】",Img_out5);}int main (){ Img_in=imread("lenna.jpg"); imshow("【原图】",Img_in); namedWindow("【方框滤波】"); createTrackbar("内核大小","【方框滤波】",&kernel_box,25,callback_box); callback_box(kernel_box,0); namedWindow("【均值滤波】"); createTrackbar("内核大小","【均值滤波】",&kernel_mean,25,callback_mean); callback_mean(kernel_mean,0); namedWindow("【高斯滤波】"); createTrackbar("内核大小","【高斯滤波】",&kernel_gaussian,25,callback_gaussian); callback_gaussian(kernel_gaussian,0); namedWindow("【中值滤波】"); createTrackbar("内核大小","【中值滤波】",&kernel_median,25,callback_median); callback_median(kernel_median,0); namedWindow("【双边滤波】"); createTrackbar("内核大小","【双边滤波】",&kernel_bilateral,25,callback_bilateral); callback_bilateral(kernel_bilateral,0); waitKey(0); return 0;}
双边滤波——bilateralFilter函数
双边滤波是一种结合了图像的空间邻近度和像素值相似度的滤波方法。它通过同时考虑像素的欧式距离和灰度差值来生成滤波器核,从而在平滑去噪的同时保留图像的边缘细节。这种滤波器不仅简单且局部,而且不需要迭代处理,具有高效率的特点。
代码实现
以下是使用OpenCV实现双边滤波的代码示例:
#include#include #include #include using namespace std;using namespace cv;Mat Img_in , Img_out1, Img_out2,Img_out3,Img_out4,Img_out5;void callback_box(int ,void*){ if (kernel_box%2 ==0) kernel_box=kernel_box+1; boxFilter(Img_in,Img_out1,-1,Size(kernel_box,kernel_box)); imshow("【方框滤波】",Img_out1);}void callback_mean(int ,void*){ if (kernel_mean%2 ==0) kernel_mean=kernel_mean+1; blur(Img_in,Img_out2,Size(kernel_mean,kernel_mean)); imshow("【均值滤波】", Img_out2);}void callback_gaussian(int ,void*){ if (kernel_gaussian%2 ==0) kernel_gaussian=kernel_gaussian+1; GaussianBlur(Img_in,Img_out3,Size(kernel_gaussian*2+1 , kernel_gaussian*2+1),0,0); imshow("【高斯滤波】",Img_out3);}void callback_median(int ,void*){ if (kernel_median%2 ==0) kernel_median=kernel_median+1; medianBlur(Img_in,Img_out4,kernel_median*2+1); imshow("【中值滤波】",Img_out4);}void callback_bilateral(int ,void*){ bilateralFilter(Img_in , Img_out5,kernel_bilateral,kernel_bilateral*2,kernel_bilateral/2); imshow("【双边滤波】",Img_out5);}int main (){ Img_in=imread("lenna.jpg"); imshow("【原图】",Img_in); namedWindow("【方框滤波】"); createTrackbar("内核大小","【方框滤波】",&kernel_box,25,callback_box); callback_box(kernel_box,0); namedWindow("【均值滤波】"); createTrackbar("内核大小","【均值滤波】",&kernel_mean,25,callback_mean); callback_mean(kernel_mean,0); namedWindow("【高斯滤波】"); createTrackbar("内核大小","【高斯滤波】",&kernel_gaussian,25,callback_gaussian); callback_gaussian(kernel_gaussian,0); namedWindow("【中值滤波】"); createTrackbar("内核大小","【中值滤波】",&kernel_median,25,callback_median); callback_median(kernel_median,0); namedWindow("【双边滤波】"); createTrackbar("内核大小","【双边滤波】",&kernel_bilateral,25,callback_bilateral); callback_bilateral(kernel_bilateral,0); waitKey(0); return 0;}
效果展示
通过上述代码,我对“lenna.jpg”图像进行了不同滤波处理,结果如下:
通过实际操作,我深刻体会到了中值滤波和双边滤波在不同场景下的应用价值。中值滤波在去噪方面表现突出,而双边滤波则在保边去噪方面更为理想。这些滤波技术为图像处理提供了丰富的工具,对我理解和应用OpenCV至关重要。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2026年06月01日 15时49分29秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP SPL标准库-迭代器
2023-02-27
php zookeeper实现分布式锁
2023-02-27
PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
2023-02-27
php 反射
2023-02-27
PHP 实现N阶矩阵相乘
2023-02-28
php 延迟静态绑定static关键字
2023-02-28
Redis入门
2023-02-28
PHP 截取字符串乱码的解决方案
2023-02-28
php 接口类与抽象类的实际作用
2023-02-28
PHP 插入排序 -- 折半查找
2023-02-28
PHP 支持8种基本的数据类型
2023-02-28
php 放大镜,放大镜放大图片效果
2023-02-28
PHP 数据库连接池实现
2023-02-28
php 数组 区别,PHP中数组的区别
2023-02-28
PHP 数组怎么添加一个元素
2023-02-28
PHP 文件操作
2023-02-28
php 文字弹幕效果代码,HTML5文字弹幕效果
2023-02-28
php 时间日期函数,获取今天开始时间,结束时间
2023-02-28
php 标准规范
2023-02-28
PHP 浮点型精度运算相关问题
2023-02-28