Sobel边缘检测 - Matlab

4

作为我的作业的一部分,我需要使用Sobel边缘检测计算并显示图像balls1.tif的边缘幅度图像和边缘方向图像。

请勿使用Matlab的edge函数,您可以使用conv2。 显示一个二值化边缘图像(1表示有边缘像素,0表示没有边缘),其中强的边缘像素上面有一个阈值。 确定一个阈值,以消除球阴影。

以下是我的main.m文件:

addpath(fullfile(pwd,'TOOLBOX'));
addpath(fullfile(pwd,'images'));

%Sobel Edge Detection 
Image = readImage('balls1.tif');
showImage(Image);
message = sprintf('Sobel Edge Detection');
sobelEdgeDetection(Image);
uiwait(msgbox(message,'Done', 'help'));
close all

这是我的SobeEdgeDetection.m文件

function [ output_args ] = SobelEdgeDetection( Image )

maskX = [-1 0 1 ; -2 0 2; -1 0 1];
maskY = [-1 -2 -1 ; 0 0 0 ; 1 2 1] ;

resX = conv2(Image, maskX);
resY = conv2(Image, maskY);

magnitude = sqrt(resX.^2 + resY.^2);
direction = atan(resY/resX);
thresh = magnitude < 101;
magnitude(thresh) = 0;
showImage(magnitude);

end

我的问题是:
1. 方向用于什么?如何显示它?
2. 有没有更好的方法获得一个阈值来消除球的阴影。我使用了试错法...
这是我展示大小的结果:
enter image description here
图片:enter image description here

1
方向 - 是图像上的梯度方向,它与物体边缘垂直。您的图像不会让您消除阴影:在这种情况下,您将失去一些上边框。 - Eddy_Em
2个回答

1
这是您第一个问题的答案:
在Sobel边缘检测算法中,所获得的方向基本上是梯度。
图像处理中的梯度被定义为强度变化最大的方向。变化可以是强度增加或减少。此外,这种变化是针对每个像素计算的,这意味着对于每个像素都要测量最大的强度变化。resX(在您的问题示例中,SobelEdgeDetection.m)表示X方向的变化,而resY则定义了Y方向的变化。
要实际查看它,请在Matlab的命令窗口中执行以下命令: imshow(resX);
还可以尝试,imshow(resY)

1
根据你的第二部分作业,你已经解决了它,也就是消除了阴影。
对于第一个问题:方向可以用多种不同的方式。这是最简单的方法:用它制作漂亮的图片。考虑它更有用的原因是当你进行非极大值抑制时,但由于你没有手动执行它,所以没有太多直接的用处。为了可视化梯度方向的结果,只需要为你考虑的每个方向建立颜色即可。为了进一步简化可视化,还假设你将方向缩小到30度的增量,从0开始逐步增加到180度。这样,如果你有35度的方向,例如,你将其视为30度(因为它是在你缩小的列表中最近的一个)。接下来我们看到一张图像和其梯度方向的可视化,考虑Sobel和离散化为30度的步长(黑色表示0度方向)。

enter image description here enter image description here

自动确定好的阈值通常不是一项容易的任务。例如,您可以从Otsu方法提供的阈值开始,并根据某些其他直方图分析根据您要解决的问题减少或增加其值。

当我尝试使用imagsec或showImage时,我的图像变成了全黑。我需要进行一些缩放吗? - Gilad
我没有进行任何缩放,只是按照答案中所描述的进行操作。从0度到29度的所有数值都被赋予了强度为0(黑色),从30到59则被赋予其他颜色,以此类推。然后你展示了这些内容。 - mmgp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接