关于 1x2 卷积和组合梯度

马洛林 Q

所以我试图理解卷积和制作梯度的过程,我只想在名为 I1 的图像上看到 1x2 算子的水平梯度。当我尝试使用此代码时,我只得到一个黑屏,所以我试图找出这里出了什么问题,当然没有使用 conv。(我也将尝试使用 Sobel,所以我想要一些有关如何实现这一目标的提示。)

    I1    = uint8(round(sum(C1,3)/3));

figure,imshow(I1);

Kern =[-1,1];
Omega = zeros([size(I1,1) size(I1,2)]);

for i=1:ROWS
    for j=1:COLS
        Work = double(I1(i,j)).*Kern;
        Omega(i,j) = sum(Work(:));  
    end
end

figure,imshow(uint8(Omega));
烧杯

问题是您只使用 1 个像素 fromI1乘以您的内核。由于您使用的是一个值,因此最终效果是:

a.*[-1 1]

这给了你

[-a a]

当你总结这个时,显然你得到零。要解决此问题,您需要使用与I1内核中的元素相同数量的像素(在本例中为 2)。这也意味着您需要调整循环索引:

for i=1:ROWS-1       % avoid accessing outside image
    for j=1:COLS-1
        Work = double(I1(i,j:j+1)).*Kern;   % j:j+1 gives us 2 pixels
        Omega(i,j) = sum(Work(:));  
    end
end

您还可以将循环内的两行压缩为一行:

Kern = [-1;1];   % make Kern a column vector
...

for i=1:ROWS-1
    for j=1:COLS-1
        Omega(i,j) = double(I1(i,j:j+1))*Kern;  % vector multiplication, not elementwise
    end
end

您可能想尝试的另一件事是使用imagesc(Omega)而不是imshow. imagesc将缩放图像的值,使其更明显。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章