簡體   English   中英

在matlab中實現IMFILTER

[英]Implementing IMFILTER in matlab

我試圖使用imfilter過濾圖像。 我應該得到與imfilter相同的結果,但我不斷得到不同的結果。 誰能告訴我哪里出錯了?

orignal=imread('obj6__17.png');
filter=1/9*[-1 -1 -1 ; -1 17 -1 ; -1 -1 -1];
s=size(orignal);
r=zeros(s(1));
temp = zeros(3);

for i= 2: s(1)-1
for j = 2: s(2)-1

    for n= 1: 3
        for m= 1:3
            temp(n,m)=orignal(i+2-n,j+2-m)*filter(n,m);
        end
    end
    r(i,j)=sum(single(sum(temp)));
end
end

r的大小應該與我想的原始大小相同。 我不明白為什么你用single轉換成單精度。 無論如何,我想你想做以下事情:

%# Let's first create a small test image from the built-in peppers image
original = im2double(imread('peppers.png'));
original = original(1:5,1:8,1);

filter = 1/9 * [-1 -1 -1 ; -1 17 -1 ; -1 -1 -1];
s = size(original);
r = zeros(s);

for i = 2:s(1)-1
    for j = 2:s(2)-1
        temp = original(i-1:i+1,j-1:j+1) .* filter;
        r(i,j) = sum(temp(:));
    end
end

結果如下:

r =

         0         0         0         0         0         0         0         0
         0    0.2336    0.2157    0.2514    0.2436    0.2257    0.2344         0
         0    0.2453    0.2444    0.2671    0.2693    0.2418    0.2240         0
         0    0.2741    0.2728    0.2397    0.2505    0.2375    0.2436         0
         0         0         0         0         0         0         0         0

有了imfilter ,它是:

r2 = imfilter(original, filter)

r2 =

    0.3778    0.3325    0.3307    0.3442    0.3516    0.3312    0.3163    0.3856
    0.3298    0.2336    0.2157    0.2514    0.2436    0.2257    0.2344    0.3386
    0.3434    0.2453    0.2444    0.2671    0.2693    0.2418    0.2240    0.3512
    0.3272    0.2741    0.2728    0.2397    0.2505    0.2375    0.2436    0.3643
    0.3830    0.3181    0.3329    0.3403    0.3508    0.3272    0.3412    0.4035

如您所見,除邊框上的結果外,結果相同。 有幾種策略可以計算邊界上的圖像,將圖像鏡像到邊界外,保持相同等。請閱讀imfilter的文檔並選擇一種策略。

請注意,我沒有在此處翻轉filter ,因為濾波器在兩個方向上都是對稱的。 我建議你避免循環! 代碼中有深度為4的嵌套循環!

最后,您可以使用二維卷積來執行與imfilter相同的imfilter

r3 = conv2(original, filter, 'same');

r3 =

    0.3778    0.3325    0.3307    0.3442    0.3516    0.3312    0.3163    0.3856
    0.3298    0.2336    0.2157    0.2514    0.2436    0.2257    0.2344    0.3386
    0.3434    0.2453    0.2444    0.2671    0.2693    0.2418    0.2240    0.3512
    0.3272    0.2741    0.2728    0.2397    0.2505    0.2375    0.2436    0.3643
    0.3830    0.3181    0.3329    0.3403    0.3508    0.3272    0.3412    0.4035

這是修改代碼並給出與imfilter完全相同的結果....

%# Let's first create a small test image from the built-in peppers image
original = im2double(imread('peppers.png'));
original = original(1:5,1:8,1);

filter = 1/9 * [-1 -1 -1 ; -1 17 -1 ; -1 -1 -1];
s = size(original);
r = zeros(s);
original=padarray(original,[1,1]);
for i = 2:s(1)
for j = 2:s(2)
    temp = original(i-1:i+1,j-1:j+1) .* filter;
    r(i-1,j-1) = sum(temp(:));
end
end

這給出了與函數完全相同的結果矩陣......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM