?? 中值濾波算法改進之c語言實現.txt
字號:
中值濾波算法改進之C語言實現[原創]
這里所說的改進,主要是指中值計算方法的改進,求出中值以后,仍按原來的方法進行圖像處理。
具體思路請看user1/20989/archives/2005/367726.shtml
//
關于中值濾波算法的進一步思考[原創]
在圖像處理中,可能需要去除噪聲,常用的有鄰域平均法,即用窗口在圖像上滑動,并且把窗口中心對應的圖像中的像素值修改為鄰域(即窗口)的代數平均值。但是在圖像邊緣輪廓包含有大量的高頻信息,而鄰域平均法實質上是一個低通濾波器,直接使用鄰域平均法會使得邊界變模糊。
后來有人提出鄰域加權平均法作為改進,給窗口內不同位置的像素設不同的權,從而可以減少模糊性而較好地保留邊緣信息。
為了既能去除噪聲,又能保留邊界信息,可以使用中值濾波算法。中值濾波算法仍使用滑動窗口技術,但把窗口中心對應的圖像像素修改為窗口所覆蓋的所有的像素的中間值(即把窗口覆蓋的所有像素值按升序或降序順序排列,然后取中間值)。這樣一來,噪聲(明亮區的少數暗點或暗區的少數明亮點或者是最小值或者是最大值,取中間值可以直接丟棄這些值而不參加運算)就可以被去除,而能較好保留邊緣信息。
目前的中值濾波中“中值”一般取“中位數”,即所有元素排序后中間位置上的元素值。但是排序需要移動大量元素,效率較低。并且,我們只是為了找中值,所以不需要真的去排序。有人提出對快速排序法進行修改,當排序支點位于原數組中間位置時,即可結束循環。但仍需要移動元素位置。
思考:對窗口中的所有元素一次掃描,對于第i位置的元素,如果窗口中其他元素中有large個元素值大于i位置的元素,而有little個元素值小于i位置的元素,并且large==little或者兩者差為1或在一個合理范圍之內,我們則可認為i位置上的元素值為中值。
突然有了這么一個想法,等有時間再寫個代碼測試一下,也希望同行專家從理論上來驗證一下這個想法是否可行。
//
通過設置不同大小的數組,發現這個改進并不是很成功,尤其在數組中有大量相同元素時,可能會出現一些錯誤。但如果元素很少有重復時,效果比較理想。
代碼如下,通過兩種方法計算中值:
/*
程序功能:求中值
作者:BugEyes
主頁:http://bugeyes.blog.edu.cn
*/
#i nclude <stdlib.h>
int middle(int array[],int n)
{
int i,j;
int large=0,little=0;
for(i=0;i<n;i++)
{
if(i>0&&((array[i]>array[i-1]&&large<little)||(array[i]<array[i-1]&&little<large)||array[i]==array[i-1]))
continue;
large=little=0;
for(j=0;j<n;j++)
if(j!=i)
{
if(array[j]>=array[i])
large++;
if(array[j]<=array[i])
little++;
}
if(abs(large-little)<=3)
break;
}
return i;
}
void sort(int array[],int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=0;j<n-2;j++)
if(array[j]>array[j+1])
{
int t=array[j];
array[j]=array[j+1];
array[j+1]=t;
}
}
void output(int array[],int n)
{
int i;
for(i=0;i<n;i++)
{
if(i%20==0)
printf("\n");
printf("%4d",array[i]);
}
}
void main()
{
int i,pos;
int data[1001];
clrscr();
for(i=0;i<1001;i++)
data[i]=random(150);
pos=middle(data,1001);
printf("\nThe original data is:\n");
output(data,1001);
printf("\nThe middle value is:%4d.The position is:%4d",data[pos],pos);
sort(data,1001);
printf("\nThe sorted data is:\n");
output(data,1001);
printf("\nThe middle value from second method is:%4d",data[500]);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -