所以我试图理解卷积和制作梯度的过程,我只想在名为 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] 删除。
我来说两句