【问题标题】:Octave Arguments Error in Image Convolution 2d图像卷积 2d 中的 Octave 参数错误
【发布时间】:2018-09-23 14:45:21
【问题描述】:

我需要编写一个二维卷积函数,它会返回与 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)

我该如何解决这个错误?谢谢。

编辑:将 'valid' 更改为 'same' 后,它不再报错,但显示 'Convolution part is wrong for 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

【问题讨论】:

  • 以后你应该参考你从哪里得到代码。我已将您的问题的链接添加到您实际找到它的位置 - 幸运的是,我找到了该链接,因为它是我在之前的答案中使用的代码。

标签: image matlab 2d octave convolution


【解决方案1】:

您需要将conv2 操作的标志从'valid' 更改为'same'。当您将地面实况和卷积图像相减时,valid 的卷积结果会更小,因为您希望输出一个图像,其中过滤结果来自完全封装在图像中的内核。使用 'same' 肯定会像您提供的自定义代码 (looks familiar btw...) 中所做的那样对边框进行零填充,并确保输出大小与输入大小相同。其实自定义代码专门做了'same'padding。

此外,您正在使用 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

【讨论】:

  • 您好,首先感谢您的回答,很抱歉没有参考您的帖子。
  • 但不幸的是它并没有解决问题,当我将其更改为“相同”时,错误消息中的数字已更改。现在是:'不一致的参数(op1 是 209x232,op2 是 213x236)'
  • 你肯定没有正确使用它。看起来您在同一输入上使用了两次conv2。请清除所有变量,然后重试。另外请更新您的问题以显示您的更改。我无法判断您是否正确使用了这些更改。
  • 已编辑,它没有给出错误,但它说“卷积部分错误”。
  • 请提供您使用的实际图片。我怀疑这是由于变量类型冲突造成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
相关资源
最近更新 更多