双边滤波
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。
空间距离:指的是当前点与中心点的欧式距离。
灰度距离:指的是当前点灰度与中心点灰度的差的绝对值。
OpenCV提供bilateralFilter()函数,API的介绍如下:
CV_EXPORTS_WvoidbilateralFilter( InputArraysrc, OutputArraydst, intd, doublesigmaColor, doublesigmaSpace, intborderType=BORDER_DEFAULT );
C++实现:
usingnamespacestd; usingnamespacecv; MataddSaltNoise(constMatsrc, intn); // 添加椒盐噪声intmain(){ // 读取图像Matsrc=imread("/home/chen/dataset/lena.jpg"); if (src.empty()){ cout<<"cloud not load image."<<endl; return-1; } // 增加椒盐噪声MatsrcSaltPepper=addSaltNoise(src, 100); // 中值滤波MatdstMedian; medianBlur(srcSaltPepper, dstMedian, 3); MatdstGaussian; GaussianBlur(srcSaltPepper, dstGaussian, Size(3, 3), 3, 3); // 双边滤波MatdstBilateralFilter; bilateralFilter(srcSaltPepper, dstBilateralFilter, 25, 25*2, 25/2); namedWindow("src", WINDOW_AUTOSIZE); imshow("src", src); namedWindow("srcSaltPepper", WINDOW_AUTOSIZE); imshow("srcSaltPepper", srcSaltPepper); namedWindow("medianBlur", WINDOW_AUTOSIZE); imshow("medianBlur", dstMedian); namedWindow("GaussianBlur", WINDOW_AUTOSIZE); imshow("GaussianBlur", dstGaussian); namedWindow("bilateralFilter", WINDOW_AUTOSIZE); imshow("bilateralFilter", dstBilateralFilter); waitKey(0); return0; } // 添加椒盐噪声MataddSaltNoise(constMatsrc, intn){ Matdst=src.clone(); for (intk=0; k<n; k++){ // 随机选择行列inti=rand() %dst.rows; intj=rand() %dst.cols; if (dst.channels() ==1){ dst.at<uchar>(i, j) =255; // 盐噪声 } else{ dst.at<Vec3b>(i, j)[0] =255; dst.at<Vec3b>(i, j)[1] =255; dst.at<Vec3b>(i, j)[2] =255; } } for (intk=0; k<n; k++) { //随机取值行列inti=rand() %dst.rows; intj=rand() %dst.cols; //图像通道判定if (dst.channels() ==1) { dst.at<uchar>(i, j) =0; // 椒噪声 } else { dst.at<Vec3b>(i, j)[0] =0; dst.at<Vec3b>(i, j)[1] =0; dst.at<Vec3b>(i, j)[2] =0; } } returndst; }