1.中值滤波---非线性滤波
Mat medianBlurImg;
cv::medianBlur(SrcImg,medianBlurImg,5);
//16U图像--系数只能为3,5,大于5会出错
基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,主要是利用中值不受分布序列极大值和极小值影响的特点,让周围的像素值接近真实的值从而消除孤立的噪声点。
void medianBlur(InputArray src, OutputArray dst, int ksize)
InputArray src: 输入图像。特别注意的是图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。
OutputArray dst: 输出图像。尺寸和类型与输入图像一致,可以使用Mat::Clone以原图像为模板来初始化输出图像dst。
int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7等
2.双边滤波--非线性滤波
Mat bilateralFilterImg;
cv::bilateralFilter(SrcImg, bilateralFilterImg, 9, 75, 75);
void cv::bilateralFilter ( InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
)
--无法使用16U
//输入图片需要是 8 位的数据类型,或者浮点型,可以是单通道,或者三通道。
Source 8 - bit or floating - point, 1 - channel or 3 - channel image.
[双边滤波]可以在去除噪声的同时,保持边缘信息相对清晰。但是,相比于大多数滤波器,双边滤波的速度是非常慢的。
关于 sigma 的值: 通常为了简化,两个 sigma 的值可以设置为相等。如果这两个值都非常小,比如小于 10,则滤波器没有什么太大的效果。如果大于 150,则会有非常强的影响,甚至会让图片产生卡通化的效果。
关于滤波器尺寸: 通常 d 大于 5 的时候,滤波过程会非常慢,所以如果是在线处理,那么建议 d 设置为 5,而离线处理非常多的噪声的情况,可以考虑把 d 设置为 9。