中值滤波器
中值滤波器是一种非线性滤波器,常用于消除图像中的椒盐噪声。与低通滤波不同的是,中值滤波有利于保留边缘的尖锐度,但它会洗去均匀介质区域中的纹理。
椒盐噪声
椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声是指两种噪声,一种是盐噪声(salt noise)盐=白色(255),另一种是胡椒噪声(pepper noise),椒=黑色(0)。前者是高灰度噪声,后者属于低灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。对于彩色图像,则表现为在单个像素BGR三个通道随机出现的255与0,如下图所示。
中值滤波器
在输入图像x(n1, n2)中,以任一像素为中心设置一个确定的邻域A,A的边长为2N+1,(N=0,1,2,…)。将邻域内各像素的强度值按大小顺序排列,取位于中间位置的那个值(中值)作为该像素点的输出值,遍历整幅图像就可完成整个滤波过程:A=x(i,j), y=Med{x1, x2, x3,…,x2N+1}
函数
void medianBlur( InputArray src, OutputArray dst,int ksize );
参数
src — 输入图像
dst — 输出图像, 必须与 src 相同类型
ksize — 内核大小 (只需一个值,因为使用正方形窗口),必须为奇数。
- // load image
- cv::Mat image = imread("f:\\images\\castle.jpg",1);
- cv::resize(image, image, cv::Size(), 0.3, 0.3);
- // call function to add noise
- salt(image,3000);//加入盐噪声255
- pepper(image,3000);//加入椒噪声0
- // display result
- cv::imshow("salted image",image);
- //median filte
- Mat resutl;
- cv::medianBlur(image,resutl,3);
- //display result
- cv::imshow("median filted image",resutl);
- cv::waitKey();
加入椒盐噪声的图像
中值滤波后的图像
中值滤波器对椒盐噪声抑制非常有效,这是因为椒盐噪声值为255或0,它散布在邻域中,不是最大值就是最小值,不可能成为中值,因此能被较好的滤除。