本文共 4421 字,大约阅读时间需要 14 分钟。
在图像处理领域,中值滤波和双边滤波是两种常用的去噪和保边方法。以下是对这两种滤波器的详细介绍及其实现代码。
中值滤波是一种非线性滤波技术,它通过取像素点邻域内灰度值的中值来替代原像素点的灰度值。这种方法在去除脉冲噪声和椒盐噪声的同时,能够有效地保留图像的边缘细节。与均值滤波相比,中值滤波不易受到噪声的影响,因此在去噪方面表现优于均值滤波,但计算复杂度较高。
以下是使用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;}
双边滤波是一种结合了图像的空间邻近度和像素值相似度的滤波方法。它通过同时考虑像素的欧式距离和灰度差值来生成滤波器核,从而在平滑去噪的同时保留图像的边缘细节。这种滤波器不仅简单且局部,而且不需要迭代处理,具有高效率的特点。
以下是使用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至关重要。
转载地址:http://oerfk.baihongyu.com/