在很多情况下,使用邻域像素的非线性滤波会得到更好的效果。比如在噪声是散粒噪声而不是高斯噪声
1.中值滤波
用像素点邻域灰度值的中值来代替该像素点的灰度值。对于斑点噪声和椒盐噪声来说尤其有用。对于一些细节(特别是细、尖顶等)多的图像不太合适。
与均值滤波对比:
优势:消除噪声能力更胜一筹,无论是消除噪声还是保存边缘方面都不错的选择。
劣势:花费的时间是均值滤波的5倍以上。
void medianBlur(InputArray src,OutputArray dst,int ksize)
src | 输入参数1/3/4通道的Mat类型图像 |
dst | 输出参数,尺寸与类型与源图像一样 |
ksize | 必须为奇数,大于1 |
2.双边滤波
是结合图像的空间邻近度和像素值相似度的一种折中处理。其好处就是可以做到边缘保存。
void bilateralFilter(InputArray src,OutputArray dst,int d, double sigmaColor,double sigmaSpace,int borderType=BORDER_DEFAULT)
src | 输入参数,源图像 |
dst | 目标图像,输出参数 |
d | 每个像素邻域的直径 |
sigmaColor | 颜色空间滤波器的sigma值,该值越大,就表明该像素邻域内有越宽广的颜色会被混合在一起 |
sigmaSpace | 坐标空间的标注方差,数值越大,以为值越远的像素会互相影响 |
borderType | 某种边界模式有默认值 |
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
Mat image = imread("F:\\C++project\\picturetest\\2.jpg");
namedWindow("中值滤波(原图)");
namedWindow("中值滤波(效果图)");
imshow("中值滤波(原图)", image);
Mat out;
bilateralFilter(image, out, 25, 25 * 2, 25 / 2);
//medianBlur(image, out, 7);
//GaussianBlur(image, out, Size(3, 3),0,0);
imshow("中值滤波(效果图)", out);
waitKey(0);
return 0;
}