中值滤波原理及c语言的实现,关于中值滤波算法,以及C语言实现(转)
1、什么是中值濾波?
中值濾波是對一個滑動窗口內(nèi)的諸像素灰度值排序,用其中值代替窗口中心象素的原來灰度值,它是一種非線性的圖像平滑法,它對脈沖干擾級椒鹽噪聲的抑制效果好,在抑制隨機噪聲的同時能有效保護邊緣少受模糊。
中值濾波可以過濾尖峰脈沖。目的在于我們對于濾波后的數(shù)據(jù)更感興趣。濾波后的數(shù)據(jù)保留的原圖像的變化趨勢,同時去除了尖峰脈沖對分析造成的影響。
以一維信號的中值濾波舉例。對灰度序列80、120、90、200、100、110、70,如果按大小順序排列,其結(jié)果為70、80、90、10O、110、120、200,其中間位置上的灰度值為10O,則該灰度序列的中值即為100。一維信號中值濾波實際上就是用中值代替規(guī)定位置(一般指原始信號序列中心位置)的信號值。對前面所舉的序列而言,中值濾波的結(jié)果是用中值100替代序列80、120、90、200、100、110、70中的信號序列中心位置值200,得到的濾波序列就是80、120、90、100、100、110、70。如果在此序列中200是一個噪聲信號,則用此方法即可去除這個噪聲點。
二維中值濾波算法是:對于一幅圖像的象素矩陣,取以目標象素為中心的一個子矩陣窗口,這個窗口可以是3*3 ,5*5 等根據(jù)需要選取,對窗口內(nèi)的象素灰度排序,取中間一個值作為目標象素的新灰度值。窗口示例如ooooxoooo上面x為目標象素,和周圍o組成3*3矩陣Array,然后對這9個元素的灰度進行排序,以排序后的中間元素Array[4]為x的新灰度值,如此就完成對象素x的中值濾波,再迭代對其他需要的象素進行濾波即可。
圖像處理中,中值濾波的實現(xiàn)方法
1:通過從圖像中的某個采樣窗口取出奇數(shù)個數(shù)據(jù)進行排序
2:用排序后的中值取代要處理的數(shù)據(jù)即可
中值濾波的算法實現(xiàn)過程,重點是排序,最常用的冒泡排序~~
把濾波區(qū)間的數(shù)據(jù)從小到大進行排序,然后取中值,(如果是奇數(shù)個數(shù)據(jù),那么中值就只有一個了,如果偶數(shù)個數(shù)據(jù),中值有兩個,可以對兩個數(shù)據(jù)再求平均)
下面是一個C語言實現(xiàn)中值濾波的函數(shù):
unsigned char GetMedianNum(int * bArray, intiFilterLen)
{int i,j;//循環(huán)變量
unsigned charbTemp;//用冒泡法對數(shù)組進行排序
for (j = 0; j < iFilterLen - 1; j ++)
{for (i = 0; i < iFilterLen - j - 1; i ++)
{if (bArray[i] > bArray[i + 1])
{//互換
bTemp =bArray[i];
bArray[i]= bArray[i + 1];
bArray[i+ 1] =bTemp;
}
}
}//計算中值
if ((iFilterLen & 1) > 0)
{//數(shù)組有奇數(shù)個元素,返回中間一個元素
bTemp = bArray[(iFilterLen + 1) / 2];
}else{//數(shù)組有偶數(shù)個元素,返回中間兩個元素平均值
bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;
}returnbTemp;
}
注:bArray 是一個整形指針,我們傳入的一般是一個數(shù)組,用來存儲待排序的數(shù)據(jù)? ? iFilterLen 是濾波器的長度? ?用在圖像處理中時,由于像素的取值范圍是0~255,剛好是unsigned char 的范圍,所以函數(shù)的返回值是unsigned char,如果我們要處理的數(shù)是float型,或其他類型,返回值也可以更改~~返回值是bTemp,也即是我們想得到的中值
下面是一個完整的C語言程序,用在圖像處理中
/*************************************************************************
* 函數(shù)名稱:
* MedianFilter()
* 參數(shù):
* int iFilterH - 濾波器的高度
* int iFilterW - 濾波器的寬度
* int iFilterMX - 濾波器的中心元素X坐標
* int iFilterMY - 濾波器的中心元素Y坐標
* 說明:
* 該函數(shù)對DIB圖像進行中值濾波。
************************************************************************/
#define iFilterW 1
#define iFilterH 1
#define iFilterMX 1
#define iFilterMY 1
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)unsignedchar GetMedianNum(int * bArray, intiFilterLen);void MedianFilter(unsigned char *pImg1,unsigned char *pImg,int nWidth,intnHeight)
{
unsignedchar *lpSrc; //指向源圖像的指針
unsigned char *lpDst; //指向要復(fù)制區(qū)域的指針
int aValue[iFilterH*iFilterW]; //指向濾波器數(shù)組的指針
int i,j,k,l; //循環(huán)變量
int lLineBytes; //圖像每行的字節(jié)數(shù)
lLineBytes = WIDTHBYTES(nWidth * 8);for ( i=0;i
(*pImg)=0;//開始中值濾波//行(除去邊緣幾行)
for(i = iFilterMY; i < nHeight - iFilterH + iFilterMY + 1; i++)
{//列(除去邊緣幾列)
for(j = iFilterMX; j < nWidth - iFilterW + iFilterMX + 1; j++)
{//指向新DIB第i行,第j個象素的指針
lpDst = pImg + lLineBytes * (nHeight - 1 - i) +j;//讀取濾波器數(shù)組
for (k = 0; k < iFilterH; k++)
{for (l = 0; l < iFilterW; l++)
{//指向DIB第i - iFilterMY + k行,第j - iFilterMX + l個象素的指針
lpSrc = pImg1 + lLineBytes * (nHeight - 1 - i + iFilterMY - k) + j - iFilterMX +l;//保存象素值
aValue[k * iFilterW + l] = *lpSrc;
}
}//獲取中值
* lpDst = GetMedianNum(aValue, iFilterH *iFilterW);
}
}
}
unsignedchar GetMedianNum(int * bArray, intiFilterLen)
{int i,j; //循環(huán)變量
unsigned charbTemp;//用冒泡法對數(shù)組進行排序
for (j = 0; j < iFilterLen - 1; j ++)
{for (i = 0; i < iFilterLen - j - 1; i ++)
{if (bArray[i] > bArray[i + 1])
{//互換
bTemp =bArray[i];
bArray[i]= bArray[i + 1];
bArray[i+ 1] =bTemp;
}
}
}//計算中值
if ((iFilterLen & 1) > 0)
{//數(shù)組有奇數(shù)個元素,返回中間一個元素
bTemp = bArray[(iFilterLen + 1) / 2];
}else{//數(shù)組有偶數(shù)個元素,返回中間兩個元素平均值
bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;
}returnbTemp;
}
總結(jié)
以上是生活随笔為你收集整理的中值滤波原理及c语言的实现,关于中值滤波算法,以及C语言实现(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC——SetTimer函数的用法
- 下一篇: OpenCv学习篇——图像中值滤波算法