matlab 自写 自适应中值滤波 matlab自适应中值滤波算法
生活随笔
收集整理的這篇文章主要介紹了
matlab 自写 自适应中值滤波 matlab自适应中值滤波算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、自適應中值濾波(代碼)
function aOut = stPlus(aIn,f1,f2,st,stMax) %這僅僅是 AdaMedFilter (自適應中值濾波函數) 的子函數 %這僅僅是一個附屬函數/功能片段(有特定的功能,輸入若干邊界條件,輸出一個具體的數值) %輸入aIn,需要濾波的圖像,循環到的行數f1和列數f2,掩模版大小st,和掩模版最大值stMax[ra,ca] = size(aIn); %制作出掩模版 sxy = aIn(f1-round(st/2)+1:f1+round(st/2)-1,f2-round(st/2)+1:f2+round(st/2)-1); %將掩模版從小到大排序并輸出為一列 zSort = sort(sxy(:)); %基于排序后的zSort找到最大值,最小值,中值,以及循環位置的值 med = floor(st*st/2)+1; zMax = zSort(st*st); zMin = zSort(1); zMed = zSort(med); zxy = sxy(floor(st/2)+1,floor(st/2)+1); %判斷中值是否在最大值和最小值之間 delta1 = zMed-zMin; delta2 = zMax-zMed; if (delta1 * delta2) > 0%判斷循環位置的值是否在最大值和最小值之間delta3 = zxy - zMin;delta4 = zMax - zxy;if (delta3 * delta4) > 0%中值 在 最大最小值之間,且循環位置的值 在 最大最小值之間aOut = zxy;else%中值 在 最大最小值之間,但循環位置的值 不在 最大最小值之間aOut = zMed;end end if (delta1 * delta2) <= 0 %中值 不在 最大最小值之間if st < stMax%掩模版尺寸 不是 最大if f1 >= floor((st+2)/2)+1 && f2 >= floor((st+2)/2)+1 && f1 <= ra-floor((st+2)/2) && f2 <= ca-floor((st+2)/2)%該循環位置是否還可以進行st+2的循環aOut = Inf;%可以elseaOut = zMed;%不可以,直接輸出endelse%掩模版尺寸 是 最大,直接輸出aOut = zMed;end end end function aOut = AdaMedFilter(aIn,static,stMax) %這僅僅是一個 自適應 中值濾波函數 %輸入aIn圖像,輸出aOut結果 %static是人為定制的靜態變量,意義是sxy掩模版的大小,默認為3*3,stMax就是掩模版最大的大小,默認為7*7%輸入參數的默認及處理 if nargin == 1static = 3;stMax = 7; elseif nargin == 2stMax = 7; end%定義輸入及輸出圖像 %aIn是最先輸入圖像 %atemp是對輸入圖像的初步處理(比如歸一化,雙精度化,歸255化等),可以在后面調用時靈活更改 %aOut是最終輸出圖像 atemp = aIn; [ra,ca] = size(aIn); aOut = zeros(ra,ca);%定義st = 3,其中static為人為定義的靜態變量,所以 st = static;%循環,每次循環把循環位置的值給進去,輸出一個唯一的有效值賦值給aOut在當前位置的值 for f1 = round(st/2):ra-round(st/2)+1for f2 = round(st/2):ca-round(st/2)+1%st = static在每一個循環的循環開始和循環結束都有,是為了絕對保證st在每次循環開始和末尾都是絕對為3st = static;%輸入循環位置的值,輸出處理后的值,當然,有可能st = 3的中值濾波不夠,那么就會輸出temp = Inftemp = stPlus(atemp,f1,f2,st,stMax);%我已經在函數stPlus中確定當temp = Inf時,一定能夠被st+2的中值濾波處理,所以我就循環讓st增大取得有效的tempwhile(temp == Inf)st = st+2;temp = stPlus(atemp,f1,f2,st,stMax);end%每一個循環最重要給我一個唯一的正確值temp,我把它賦值給循環所在位置的aOut!aOut(f1,f2) = temp;%st = static在每一個循環的循環開始和循環結束都有,是為了絕對保證st在每次循環開始和末尾都是絕對為3st = static;end end end clear close all aIn = imread("GaosiFilter.jpg"); static = [3,7,11]; stMax = 11;%取不同的st值(掩模版大小)進行濾波 a1 = AdaMedFilter(aIn,static(1),stMax); a2 = AdaMedFilter(aIn,static(2),stMax); a3 = AdaMedFilter(aIn,static(3),stMax);%對濾波后圖片a1進行均值濾波以消除圖片輪廓的“毛刺” a1Ave = AverageFilter(a1,5); figure,imshow(a1Ave,[])%反復進行濾波3次 a12 = AdaMedFilter(a1,static(1),stMax); a13 = AdaMedFilter(a12,static(1),stMax); a14 = AdaMedFilter(a13,static(1),stMax); a15 = AdaMedFilter(a14,static(1),stMax);figure,imshow(aIn,[]) figure,imshow(a1,[]) figure,imshow(a2,[]) figure,imshow(a3,[])figure,imshow(a1,[]) figure,imshow(a12,[]) figure,imshow(a13,[]) figure,imshow(a14,[]) figure,imshow(a15,[])%對比1次濾波和5次濾波的剖線差別 figure,hold on; plot(a1(220,:),'r') plot(a15(220,:),'b')二、自適應中值濾波(圖片)
1、輸入的噪聲圖像
2、當st = 3,stmax = 11時輸出的濾波后圖像
3、分析
中值濾波對胡椒噪聲和鹽噪聲濾波效果特別好,但是自適應保邊中值濾波會讓濾波后圖片的邊緣出現“毛刺”,這個時候我們可以采用均值濾波,以圖片稍微變模糊一些的代價將邊緣的毛刺消除,如下圖:
三、st的不同對濾波效果的影響
1、st = 3
2、st = 7
3、st = 11
4、結論
? 隨著st(掩模版大小)的增大,濾波效果并沒有變得更好,甚至會讓原本清晰的圖片邊緣變得更模糊。
四、探究對圖像重復進行濾波多次對濾波效果的影響
1、濾波一次圖片
2、濾波五次圖片
3、對比一次濾波的剖線和五次濾波的剖線
說明:
藍色線條是“5次濾波”圖片的剖線;紅色線條是“1次濾波”圖片的剖線
4、結論
? 從圖片上看,一次濾波和五次濾波效果差別不大,但是從剖線上看,很明顯的感知到,對于圖片平滑部位,一次濾波和五次濾波效果相差無幾,但是對于圖像急劇變化的部分,很明顯的是五次濾波后的圖像線條更加的平滑,變化更加均勻!
總結
以上是生活随笔為你收集整理的matlab 自写 自适应中值滤波 matlab自适应中值滤波算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性同余法
- 下一篇: 变分法与最优控制matlab,1987_