7

我正在尝试过滤图像而不使用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
4

2 回答 2

7

的大小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 的嵌套循环!

最后,您可以使用 2-D 卷积来执行以下操作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
于 2012-05-20T12:08:32.483 回答
0

这是修改代码并给出与 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

这给出了与函数完全相同的结果矩阵......

于 2014-01-24T14:13:23.833 回答