一 中值滤波概念
中值滤波算法以某像素的领域图像区域中的像素值的排序为基础,将像素领域内灰度的中值代替该像素的值[1];
如:以3*3的领域为例求中值滤波中像素5的值
图1
1)int pixel[9]中存储像素1,像素2...像素9的值;
2)对数组pixel[9]进行排序操作;
3)像素5的值即为数组pixel[9]的中值pixel[4]。
中值滤波对处理椒盐噪声非常有效。
二 中值滤波代码实现
以下为MedianFilter文件中class MyImage中的中值滤波功能的实现代码:
1 //中值滤波:本算法采用3*3的领域范围 2 void MyImage::MedianFilterOper() 3 { 4 //0. 准备:获取图片的宽,高和像素信息, 5 int const num = 3 * 3; 6 unsigned char pixel[num] = { 0 }; //保存领域的像素值 7 int width = m_bmpInfo.biWidth; //位图的宽度 8 int height = m_bmpInfo.biHeight; //位图的高度 9 int widthbyte = (width * m_bmpInfo.biBitCount / 8 + 3) / 4 * 4; 10 //相对于中心点,3*3领域中的点需要偏移的位置 11 int delta[3 * 3][2] = { 12 { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 0 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, {1, 1} 13 }; 14 15 //1. 中值滤波 16 for (int i = 1; i < height-1; ++i) 17 { 18 for (int j = 1; j < widthbyte-1; ++j) 19 { 20 //1.1 提取领域值 21 for (int k = 0; k < num; ++k) 22 { 23 pixel[k] = m_imagedata[(i + delta[k][0])*widthbyte + j + delta[k][1]]; 24 } 25 //1.2 排序:利用快排函数 26 qsort(pixel, num, sizeof(unsigned char), compa); 27 //1.3 获取该中心点的值 28 m_imagedata[i*widthbyte + j] = pixel[num / 2]; 29 } 30 } 31 }
三 程序运行效果及总结
执行MedianFilter\可执行文件\MedianFilter.exe文件,MedianFilter\可执行文件\Image文件夹下将根据初始图片init.bmp生成中值滤波后的图片result.bmp,对比如下:
图2:init.bmp 图3:result.bmp
总结:因为可能对图片格式的理解仍然不到位,程序的执行效果虽然去除了大部分的噪声,但并未完全去除,还需要优化。
四 参考文献
[1] 冈萨雷斯等. 数字图像处理(第三版)[M].电子工业出版社,2011:96
[2] 宋亮等. 浅谈图像处理与BMP图像文件格式.[EB/OL].
[3] 江南烟雨. C++读取、旋转和保存bmp图像文件编程实现[EB/OL].
http://blog.csdn.net/xiajun07061225/article/details/6633938, 2011
备注:MedianFilter文件夹中的“读取图片”和“保存图片”的代码参考[2][3]。