1. 程式人生 > 其它 >matlab 中值濾波_【影象處理】自適應中值濾波

matlab 中值濾波_【影象處理】自適應中值濾波

技術標籤:matlab 中值濾波matlab中值濾波matlab中值濾波函式matlab改變影象尺寸swing 視窗自適應大小

中值濾波器(Median Filter)

中值濾波的思想就是比較一定領域內的畫素值的大小,取出其中值作為這個領域的中心畫素新的值。假設對一定領域內的所有畫素從小到大進行排序,如果存在孤立的噪聲點,比如椒鹽噪聲(椒噪聲——較小的灰度值,呈現的效果是小黑點;鹽噪聲——較大的灰度值,呈現的效果是小白點),那麼從小到大排序的這個陣列中,那些孤立的噪聲一定會分佈在兩邊(要麼很小,要麼很大),這樣子取出的中值點可以很好地保留畫素資訊,而濾除了噪聲點的影響。中值濾波器受濾波視窗大小影響較大,用於消除噪聲和保護影象細節,兩者會存在衝突。如果視窗較小,則能較好地保護影象中的一些細節資訊,但對噪聲的過濾效果就會打折扣;反之,如果視窗尺寸較大則會有較好的噪聲過濾效果,但也會對影象造成一定的模糊效果,從而丟失一部分細節資訊。另外,如果在濾波視窗內的噪聲點的個數大於整個視窗內畫素的個數,則中值濾波就不能很好的過濾掉噪聲。

自適應中值濾波器(Adaptive Median Filter)

在噪聲密度不是很大的情況下(根據經驗,噪聲的出現的概率小於0.2),使用中值濾波的效果不錯。但是當噪聲出現的概率比較高時,原來的中值濾波演算法就不是很有效了。只有增大濾波器視窗尺寸,儘管會使影象變得模糊。

使用自適應中值濾波器的目的就是,根據預設好的條件,動態地改變中值濾波器的視窗尺寸,以同時兼顧去噪聲作用和保護細節的效果。

下面是自適應中值濾波器演算法的詳細描述:

預先定義好以下符號:

SxySxy:濾波器的作用區域,濾波器視窗所覆蓋的區域,該區域中心點為影象中第y行第x列個畫素點;

ZminZmin:SxySxy中最小的灰度值;

ZmaxZmax:SxySxy中最大的灰度值;

ZmedZmed:SxySxy中所有灰度值的中值;

ZxyZxy:表示影象中第y行第x列個畫素點的灰度值;

SmaxSmax:SxySxy所允許的最大視窗尺寸;

自適應中值濾波器分為以下兩個過程,A和B:

A:

1. A1 = ZmedZmed - ZminZmin

2. A2 = ZmedZmed - ZmaxZmax

3. 如果A1>0A1>0 且 A2<0A2<0,則跳轉到B

4. 否則,增大視窗的尺寸

5. 如果增大後的尺寸≤≤SmaxSmax,則重複A

6. 否則,直接輸出ZmedZmed

B:

1. B1 = ZxyZxy - ZminZmin

2. B2 = ZxyZxy - ZmaxZmax

3. 如果B1>0B1>0 且 B2<0B2<0,則輸出ZxyZxy

4. 否則輸出ZmedZmed

直觀解釋

在自適應中值濾波演算法中,A步驟裡面會先判斷是否滿足Zmin

接下來考慮跳轉到B之後的情況:判斷中心點的畫素值是否是噪聲點,判斷條件為Zmin

%*******************************************%———自適應中值濾波法去除大密度椒鹽噪聲———%  主要思想%  判斷當前畫素是否為噪聲點%   1) NO ->不處理%   2) YES->自適應中值濾波  %   3) 邊緣處理%                             04/01/2018%******************************************close all;clc;clear allset(0,'defaultfigurecolor','w')%讀取影象I=imread('rice.png');%變為灰度圖% I=rgb2gray(I);%加椒鹽噪聲In=imnoise(I,'salt & pepper',0.7);%求影象最大最小值max=max(max(In));min=min(min(In));%建立一幅影象size=size(In);J=zeros(size);%自適應中值濾波for i=2:size(1)-1    for j=2:size(2)-1        if(In(i,j)In(i,j)>min)           J(i,j)=I(i,j);        else            for k=1              A=In(i-k:i+k,j-k:j+k);              B=median(median(A));                if(Bmin)                   J(i,j)=B;                   break;                end            end        end    endend%邊緣處理%第一行for i=2:size(2)-1    a=round((In(1,i-1)+In(1,i)+In(1,i+1))/3);    J(1,i)=a;end%最後一行for i=2:size(2)-1    a=round((In(size(1),i-1)+In(size(1),i)+In(size(1),i+1))/3);    J(size(1),i)=a;end%第一列for i=2:size(1)-1    a=round((In(i-1,1)+In(i,1)+In(i+1,1))/3);    J(i,1)=a;end%最後一列for i=2:size(1)-1    a=round((In(i-1,size(2))+In(i,size(2))+In(i+1,size(2)))/3);    J(i,size(2))=a;end%左上角J(1,1)=round((J(1,2)+J(2,1))/2);%左下角J(size(1),1)=round((J(size(1),2)+J(size(1)-1,1))/2);%右上角J(1,size(2))=round((J(1,size(2)-1)+J(2,size(2)))/2);%右下角J(size(1),size(2))=round((J(size(1),size(2)-1)+J(size(1)-1,size(2)))/2);J=uint8(J);%figure,imshow(I);%用評價函式評價SMF處理結果K=medfilt2(In);snr_1=snr(I,K);%用評價函式評價本演算法處理結果snr_2=snr(I,J);%顯示處理結果subplot(121),imshow(In);subplot(122),imshow(J);

往期回顧>>>>>>

【模式識別】Matlab指紋識別【影象處理】LSB水印技術matlab自動識別銀行卡號【基礎教程】MATLAB匯出高清晰圖片無參考影象質量評價之基於多特徵的增強影象質量評價

2990ef3cd435de9ce38dcb70acf8c5b9.png