我正在寻找图像的渐变。现在我只是使用 5 x 5 图像。我更感兴趣的是找到梯度的方向,但我没有在纸上手动得到结果,因为我使用 MATLAB 函数 imgradient
得到它们.请参阅以下图像以了解有关输入图像和此处用于查找图像梯度的 Sobel 过滤器的更多信息。此处使用的 3 x 3 sobel 运算符之一是我使用该函数获得的运算符
f1 = fspecial('sobel');
另一个是通过转置
f1
获得的.请注意,我试图在这里找到一个被红色四舍五入的像素的方向。在前两种情况下,我的结果与我使用
imgradient
获得的结果相匹配函数,但在第三种情况下 imgradient
给出 -135 度,而我得到的是 -45。请帮我找出错误。还请解释如何解释以下梯度方向,如下图所示。
最佳答案
您的计算是正确的,但强烈建议您 不要使用 atan(y/x)
定义,因为这个计算不知道梯度的角度所在的象限。做 atan(y/x)
如果不正确,您的组件会错误地报告角度为 -45 度。您应该使用 atan2
反而。
现在是 imgradient
的内部结构很直接。我想指出的是 imgradient
报告的角度假设 y
坐标自下而上递增。另外,imgradient
应该报告指向最大变化率的方向角。在图像的情况下,这指向我们从暗像素进展到亮像素的方向。
首先调用 imgradientxy
被叫到 fspecial('sobel')
如果您提供 sobel
标志到 imgradient
.其实这部分imgradientxy
重要的是要记住(从第 75 行开始:MATLAB R2015a):
case 'sobel'
h = -fspecial('sobel'); %// Align mask correctly along the x- and y- axes
Gx = imfilter(I,h','replicate'); %'
if nargout > 1
Gy = imfilter(I,h,'replicate');
end
请注意 负
fspecial
的输出执行以及在该行提供的注释。这是为了确保检测水平边缘的掩码(即 Gy
)是 y 向下 (因为它在计算机图形学中是众所周知的)。具体来说,图像的原点在左上角而不是左下角。这是如何在
y
中布置坐标系的图示。 -下:来源:Wikipedia - Rotation Matrix
因此,当找到方向时,有一个额外的要求来确保梯度方向的角度是相对于 的。 y-up 坐标系,这是我们习惯的。因此,当您找到渐变的方向角度时,您需要否定
y
在计算角度之前进行坐标,以便角度相对于标准约定。追求您所寻求的梯度定义是
y
的常规系统。坐标自下而上递增。否定是必需的,事实上,如果您检查 imgradient
的源代码,这正是在代码的第 127 行(版本 R2015a)所做的:Gdir = atan2(-Gy,Gx)*180/pi; %// Radians to degrees
您可能会问自己为什么需要否定掩码并再次否定
y
坐标后找到方向。原因是因为需要修改的掩码来正确捕获梯度的大小,所以我们对掩码取反一次并找到梯度大小,然后我们取反 y
坐标,以便我们可以找到相对于常规坐标系的角度。在您的情况下,鉴于
Gx = 765
和 Gy = -765
, 将这些量代入上述等式产生:>> Gy = 765;
>> Gx = -765;
>> Gdir = atan2(-Gy,Gx)*180/pi
Gdir =
-135
这是有道理的,因为梯度方向对应于变化率最大的方向。 -135 度意味着我们指向西南,这在我们从暗像素进展到亮像素时确实有意义。
现在,如果您查阅第三个示例图像,
imgradient
报告的角度确实是正确的。只需画一条从暗区到亮区的线,看看它与 x
成什么样的角度。轴与向右增加的列对齐。 +90 度的第一个角度是有意义的,因为我们从底部到顶部移动以跟随黑暗区域和光线。这与图像反转的情况类似。第三种情况是我们之前看到的,第四种情况只是将第三种情况旋转了 180 度,因此自然地,从暗到亮的方向角现在是 +45 度,而不是之前的 -135 度。
关于matlab - 在 MATLAB 中使用 imgradient 时如何解释梯度的方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35238047/