在1x2卷积和组合渐变

时间:2018-03-13 01:00:55

标签: matlab image-processing

所以我试图理解卷积和制作渐变的过程,我想在名为I1的图像上看到1x2算子的水平渐变。当我试图使用这个代码时,我只得到一个黑屏,所以我想弄清楚这里出了什么问题,当然没有使用转换。 (我也将尝试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 个答案:

答案 0 :(得分:0)

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

I1

给你

a.*[-1 1]

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

I1

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

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会缩放图片的值,使其更加明显。