数字图像处理—图像滤波(中值滤波)

         图像滤波大多数用于图像的模糊处理和减小噪声(个人理解)。常见的滤波有:均值滤波,中值滤波,高斯滤波等。在这我主要介绍一下中值滤波,它对于处理椒盐噪声十分有效。下面我简单介绍下它的原理,以及我自己写的中值滤波函数。

          均值滤波:    

           对一副图像上的某个点进行中值滤波处理,先将掩模内欲求的像素及其邻域的像素值排序,确定出中值,然后将这个中值赋值给该像素。如图所示一个5 x 5邻域中,用中值124代替中心的像素值。

 

                                   数字图像处理—图像滤波(中值滤波)_第1张图片

          

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;
}

           

 注:我的代码中没有对图像的边缘像素进行处理,由于输入输出是同一张图,所以边缘像素依旧为原来的像素。
              运行结果:
           原图(带椒盐噪声):                                                                                                     处理后(中值滤波):

数字图像处理—图像滤波(中值滤波)_第2张图片     数字图像处理—图像滤波(中值滤波)_第3张图片

                   

        显然中值滤波对去除椒盐噪声有着明显的作用,但由于能力有限,并没有完全达到去除的效果,而且感觉有部分细节丢失,欢迎大神随时指点补充交流! 

      转载请说明出处!谢谢


你可能感兴趣的:(图像处理)