一 中值濾波概念
中值濾波算法以某像素的領域圖像區域中的像素值的排序為基礎,將像素領域內灰度的中值代替該像素的值[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]。