2014-09-02 201 views
0

我必須: 閱讀'cameraman.tif'並將其轉換爲雙精度,然後使用高通巴特沃斯濾波器(頻域),截止頻率40 px和等級5對其進行濾波。Binarize (等級0.1,高通)。找出距離最近'真實'像素上方20像素的所有像素。統計孤立地區及其地區的數量。這是對的嗎?Butterworth高通濾波器,Matlab

img = imread('cameraman.tif'); 
    img = double(img)/255; 
    fft = fftshift(fft2(img)); 
    N = 5; D0 = 40; 
    D = zeros(256); H = zeros(256); 

    for kz=1:256 
    for kx=1:256 
     %Butterworth 
     D(kz,kx) = sqrt((kz-128)^2 + (kx-128)^2); 
     H(kz,kx) = 1/(1+(D(kz,kx)/D0)^2*N); 
    end 
end 
filtered = fft.*(1-H); 

result = ifft2(ifftshift(filtered)); 
figure; subplot(121); imshow(img); title('Oryginalny'); 
subplot(122); imshow(result); title('Przefiltrowany'); 

    binarized = im2bw(real(result), 0.1); 

ilosc= bwdist(binarized)>20 ; 
ilosc=sum(ilosc(:)) 
figure; imshow(binarized); title('Zbinaryzowany'); 

w = binarized == 1; 
b = binarized == 0; 
biale = sum(w(:)); 
czarne = sum(b(:)); 

[blab, blobs] = bwlabel(binarized); 
+0

您是否收到任何錯誤? – Trilarion 2014-09-02 16:00:47

+0

不,它工作,它給了我像素的數量,但我不確定數字是否正確。我非常確定過濾器本身(我過去做過的那部分),但我是新來的這個bwdist的東西:) – user3748496 2014-09-02 16:09:42

+0

我只使用bwdist來計算比最接近真實像素高20px的像素。它是否正確? – user3748496 2014-09-02 17:16:19

回答

0

鑑於你對你想要完成的描述,你的代碼看起來是正確的。

這確實定義了頻域中的巴特沃思濾波器,然後高通僅在低通版本中從每個係數中減去1。根據您的意見,您只需要計算那些距離最接近真實像素約20像素的像素。假設歐幾里得距離,那麼這是正確的。

回到您的巴特沃思濾鏡:請記住,您的for循環在開始定義濾鏡和濾鏡中心將根據圖像的尺寸而改變。如果你想移動到另一個圖像,你需要改變它們。


如果我可以做一個小的建議,我會做你的過濾器的矢量,而不是使用for循環的創建。它實際上更快,並且在創建更大尺寸的濾鏡時您會注意到巨大的差異。因此,用您的Butterworth建築代碼代替:

[kx,kz] = meshgrid(1:256, 1:256); 
D = sqrt((kz - 128).^2 + (kx - 128).^2); 
H = 1 ./ ((1 + (D/D0)).^(2*N)); 
+0

非常感謝你:) – user3748496 2014-09-02 17:31:33

+0

@ user3748496不客氣!如果你覺得我幫了你的忙,請接受我的回答。這可以通過轉到我的帖子的頂部,向左看,然後單擊向上和向下箭頭下方的複選標記按鈕來完成。 – rayryeng 2014-09-02 17:40:19