图像滤波大多数用于图像的模糊处理和减小噪声(个人理解)。常见的滤波有:均值滤波,中值滤波,高斯滤波等。在这我主要介绍一下中值滤波,它对于处理椒盐噪声十分有效。下面我简单介绍下它的原理,以及我自己写的中值滤波函数。
均值滤波:
对一副图像上的某个点进行中值滤波处理,先将掩模内欲求的像素及其邻域的像素值排序,确定出中值,然后将这个中值赋值给该像素。如图所示一个5 x 5邻域中,用中值124代替中心的像素值。
Mat MedianFilter(Mat img) //中值滤波器
{
int count = 0; //领域中像素个数
int index=0;
int pixel1[9]; //数组存放像素值
int pixel2[9];
int pixel3[9];
for (int x = 1; x < img.rows-1; x++) //遍历像素,并用邻域像素的中值代替该像素
{
for (int y = 1; y < img.cols-1; y++)
{
count = 0;
for (int row = -kernel_size / 2; row <= kernel_size / 2; row++) //计算邻域像素
{
int row2 = x + row;
for (int col = -kernel_size / 2; col <= kernel_size / 2; col++)
{
int col2 = y + col;
pixel1[count] = *(img.data + img.step[0] * row2 + img.step[1] * col2); //将邻域像素放入数组
pixel2[count] = *(img.data + img.step[0] * row2 + img.step[1] * col2 + img.elemSize1());
pixel3[count] = *(img.data + img.step[0] * row2 + img.step[1] * col2 + img.elemSize1()*2);
count++;
}
}
bubblingsort(pixel1,count); //排序
bubblingsort(pixel2, count);
bubblingsort(pixel3, count);
*(img.data + img.step[0] * x + img.step[1] * y) = pixel1[count/2]; //用邻域像素的中值代替该像素
*(img.data + img.step[0] * x + img.step[1] * y + img.elemSize1()) = pixel2[count/2];
*(img.data + img.step[0] * x + img.step[1] * y + img.elemSize1()*2) = pixel3[count / 2];
}
}
return img;
}
注:我的代码中没有对图像的边缘像素进行处理,由于输入输出是同一张图,所以边缘像素依旧为原来的像素。
运行结果:
原图(带椒盐噪声): 处理后(中值滤波):
运行结果:
原图(带椒盐噪声): 处理后(中值滤波):
显然中值滤波对去除椒盐噪声有着明显的作用,但由于能力有限,并没有完全达到去除的效果,而且感觉有部分细节丢失,欢迎大神随时指点补充交流!
转载请说明出处!谢谢