图像卷积2d中的Octave参数错误

时间:2018-04-13 09:28:10

标签: image matlab 2d octave convolution

我需要编写一个2d卷积函数,它将使用conv2返回相同的结果。

我找到了conv2的替代方法,但返回的结果比conv2的结果多2,并且会导致错误。

以下是我找到的卷积函数from this post

function [ conv_res ] = convolve_im( im,filter )

[rows,cols] = size(im);
new_img = zeros(rows+2,cols+2);
new_img = cast(new_img, class(im));
new_img(2:end-1,2:end-1) = im;

conv_res = zeros(size(new_img));
conv_res = cast(conv_res, class(im));

for i=2:1:rows+1
    for j=2:1:cols+1
        value=0;
        for g=-1:1:1
            for l=-1:1:1
                value=value+new_img(i+g,j+l) * filter(g+2,l+2);
            end
        end
        conv_res(i,j)=value;
    end
end
conv_res = conv_res(2:end-1,2:end-1);
end

这就是我将结果与conv2进行比较的方式:

img = imread('puppy.jpeg');
conv_ok =1;
test_filter=[0 -1 0; -1 4 -1; 0 -1 0];

conv_res = convolve_im(img, test_filter);
ground_res = conv2(img,test_filter, 'valid');

check = abs(ground_res) - abs(conv_res);  % Line 24
if sum(abs(check(:,:))) ==0

    disp('Convolution for 3x3 works fine.');
else
    conv_ok = 0;
    disp('Convolution part is wrong for 3x3!!!');
end

这是我得到的运行时错误:

第24行

不一致的参数(op1为211x234,op2为213x236)

我该如何解决此错误?感谢。

编辑:用'same'更改'valid'后,它不再出错,但显示'3x3的卷积部分错误!!!'

以下是编辑后的测试功能:

img = imread('puppy.jpeg');
conv_ok =1;
test_filter=[0 -1 0; -1 4 -1; 0 -1 0]; %laplace filter 3x3

conv_res = convolve_im(img, test_filter);

ground_res = conv2(img,test_filter, 'same');

check = abs(ground_res) - abs(conv_res);


if sum(abs(check(:,:))) ==0

disp('Convolution for 3x3 works fine.');
else

conv_ok = 0;
disp('Convolution part is wrong for 3x3!!!');

end

1 个答案:

答案 0 :(得分:2)

您需要将conv2操作的标记从'valid'更改为'same'。当您将基础事实和卷积图像一起减去时,valid的卷积结果较小,因为您想要输出一个图像,其中过滤结果来自内核完全包含在图像中。使用'same'肯定会填充边框,就像您提供的自定义代码(looks familiar btw...)中所做的那样,并确保输出大小与输入相同。实际上,自定义代码专门执行'same'填充。

此外,您正在使用3 x 3内核进行卷积,因此最终输出将删除2行和2列,以确保返回有效的结果或内核完全位于图像内部。

此外,您必须更改图片的数据类型。目前您的图像是无符号8位整数。因为您正在使用边缘检测,所以任何负数的输出值都将被截断为0,因此您肯定无法获得正确的结果。因此,在过滤图片之前,请先将图片转换为double。你可以通过转换到double来做到这一点。我选择使用此代替im2double,因为您要检查图像的相等性,并且当图像像素不是小数时,这样做会更好。

因此,您需要进行以下更改:

img = imread('puppy.jpeg');
img = double(img); % Change
conv_ok = 1;
test_filter=[0 -1 0; -1 4 -1; 0 -1 0]; %laplace filter 3x3

conv_res = convolve_im(img, test_filter);
ground_res = conv2(img,test_filter, 'same'); % Change

check = abs(ground_res) - abs(conv_res);

if sum(abs(check(:,:))) ==0
    disp('Convolution for 3x3 works fine.');
else
    conv_ok = 0;
    disp('Convolution part is wrong for 3x3!!!');
end