所以我试图理解卷积和制作渐变的过程,我想在名为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));
答案 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
会缩放图片的值,使其更加明显。