博客
关于我
OPenCV学习笔记之六——非线性滤波(中值滤波,双边滤波)
阅读量:798 次
发布时间:2023-04-15

本文共 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”图像进行了不同滤波处理,结果如下:

  • 方框滤波:应用3x3的方框滤波器,效果较为平滑,但细节丢失较多。
  • 均值滤波:使用3x3均值滤波器,图像较平滑,但细节模糊明显。
  • 高斯滤波:应用3x3高斯滤波器,效果与均值滤波相似,但稍微平滑一些。
  • 中值滤波:应用3x3中值滤波器,去噪效果显著,细节保留较好。
  • 双边滤波:应用3x3双边滤波器,既平滑又保留边缘,效果最优。
  • 通过实际操作,我深刻体会到了中值滤波和双边滤波在不同场景下的应用价值。中值滤波在去噪方面表现突出,而双边滤波则在保边去噪方面更为理想。这些滤波技术为图像处理提供了丰富的工具,对我理解和应用OpenCV至关重要。

    转载地址:http://oerfk.baihongyu.com/

    你可能感兴趣的文章
    MariaDB的简单使用
    查看>>
    MaterialForm对tab页进行隐藏
    查看>>
    Member var and Static var.
    查看>>
    memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
    查看>>
    memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
    查看>>
    Memcached:Node.js 高性能缓存解决方案
    查看>>
    memcache、redis原理对比
    查看>>
    memset初始化高维数组为-1/0
    查看>>
    Metasploit CGI网关接口渗透测试实战
    查看>>
    Metasploit Web服务器渗透测试实战
    查看>>
    MFC模态对话框和非模态对话框
    查看>>
    Moment.js常见用法总结
    查看>>
    MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
    查看>>
    mxGraph改变图形大小重置overlay位置
    查看>>
    MongoDB可视化客户端管理工具之NoSQLbooster4mongo
    查看>>
    Mongodb学习总结(1)——常用NoSql数据库比较
    查看>>
    MongoDB学习笔记(8)--索引及优化索引
    查看>>
    mongodb定时备份数据库
    查看>>
    mppt算法详解-ChatGPT4o作答
    查看>>
    mpvue的使用(一)必要的开发环境
    查看>>