日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于中值滤波算法,以及C语言实现(转)

發布時間:2025/6/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于中值滤波算法,以及C语言实现(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源:關于中值濾波算法,以及C語言實現

1、什么是中值濾波?

?

中值濾波是對一個滑動窗口內的諸像素灰度值排序,用其中值代替窗口中心象素的原來灰度值,它是一種非線性的圖像平滑法,它對脈沖干擾級椒鹽噪聲的抑制效果好,在抑制隨機噪聲的同時能有效保護邊緣少受模糊。

中值濾波可以過濾尖峰脈沖。目的在于我們對于濾波后的數據更感興趣。濾波后的數據保留的原圖像的變化趨勢,同時去除了尖峰脈沖對分析造成的影響。

??? 以一維信號的中值濾波舉例。對灰度序列80、120、90、200、100、110、70,如果按大小順序排列,其結果為70、80、90、10O、110、120、200,其中間位置上的灰度值為10O,則該灰度序列的中值即為100。一維信號中值濾波實際上就是用中值代替規定位置(一般指原始信號序列中心位置)的信號值。對前面所舉的序列而言,中值濾波的結果是用中值100替代序列80、120、90、200、100、110、70中的信號序列中心位置值200,得到的濾波序列就是80、120、90、100、100、110、70。如果在此序列中200是一個噪聲信號,則用此方法即可去除這個噪聲點。

??? 二維中值濾波算法是:對于一幅圖像的象素矩陣,取以目標象素為中心的一個子矩陣窗口,這個窗口可以是3*3 ,5*5 等根據需要選取,對窗口內的象素灰度排序,取中間一個值作為目標象素的新灰度值。窗口示例如ooooxoooo上面x為目標象素,和周圍o組成3*3矩陣Array,然后對這9個元素的灰度進行排序,以排序后的中間元素Array[4]為x的新灰度值,如此就完成對象素x的中值濾波,再迭代對其他需要的象素進行濾波即可。

圖像處理中,中值濾波的實現方法

?

1:通過從圖像中的某個采樣窗口取出奇數個數據進行排序 2:用排序后的中值取代要處理的數據即可 中值濾波的算法實現過程,重點是排序,最常用的冒泡排序~~ 把濾波區間的數據從小到大進行排序,然后取中值,(如果是奇數個數據,那么中值就只有一個了,如果偶數個數據,中值有兩個,可以對兩個數據再求平均) 下面是一個C語言實現中值濾波的函數: unsigned char GetMedianNum(int * bArray, int iFilterLen) {int i,j;// 循環變量unsigned char bTemp;// 用冒泡法對數組進行排序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){// 數組有奇數個元素,返回中間一個元素bTemp = bArray[(iFilterLen + 1) / 2];}else{// 數組有偶數個元素,返回中間兩個元素平均值bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;}return bTemp; } 注:bArray 是一個整形指針,我們傳入的一般是一個數組,用來存儲待排序的數據 &nbsp; &nbsp; iFilterLen 是濾波器的長度 &nbsp; &nbsp;用在圖像處理中時,由于像素的取值范圍是0~255,剛好是unsigned char 的范圍,所以函數的返回值是unsigned char,如果我們要處理的數是float型,或其他類型,返回值也可以更改~~返回值是bTemp,也即是我們想得到的中值 <span style="color: rgb(51, 51, 51);">下面是一個完整的C語言程序,用在圖像處理中</span> /************************************************************************** 函數名稱:* MedianFilter()* 參數:* int iFilterH - 濾波器的高度* int iFilterW - 濾波器的寬度* int iFilterMX - 濾波器的中心元素X坐標* int iFilterMY - 濾波器的中心元素Y坐標* 說明:* 該函數對DIB圖像進行中值濾波。************************************************************************/ #define iFilterW 1 #define iFilterH 1 #define iFilterMX 1 #define iFilterMY 1 #define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)unsigned char GetMedianNum(int * bArray, int iFilterLen); void MedianFilter(unsigned char *pImg1,unsigned char *pImg,int nWidth,int nHeight) { unsigned char *lpSrc; // 指向源圖像的指針 unsigned char *lpDst; // 指向要復制區域的指針int aValue[iFilterH*iFilterW]; // 指向濾波器數組的指針int i,j,k,l; // 循環變量 int lLineBytes; // 圖像每行的字節數 lLineBytes = WIDTHBYTES(nWidth * 8);for ( i=0;i<nWidth;i++,pImg++ )(*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;// 讀取濾波器數組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);}}}unsigned char GetMedianNum(int * bArray, int iFilterLen) {int i,j; // 循環變量unsigned char bTemp;// 用冒泡法對數組進行排序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){// 數組有奇數個元素,返回中間一個元素bTemp = bArray[(iFilterLen + 1) / 2];}else{// 數組有偶數個元素,返回中間兩個元素平均值bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;}return bTemp; }

?

?

總結

以上是生活随笔為你收集整理的关于中值滤波算法,以及C语言实现(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。