我找到了图像的渐变。现在我只是使用5 x 5图像。我更感兴趣的是找到渐变的方向,但我没有在纸上手动获得结果,因为我使用MATLAB函数imgradient
得到它们。请参考以下图像以了解有关输入图像的更多信息以及此处用于查找图像渐变的Sobel滤镜。这里使用的3 x 3 sobel运算符之一是我使用函数
f1 = fspecial('sobel');
,另一个是通过转置f1
获得的。
请注意,我试图找到这里只有一个像素的方向,用红色圆整。在前两种情况下,我的结果与使用imgradient
函数获得的结果匹配,但在第三种情况下,imgradient
给出-135度,而我得到它为-45。请帮我找到错误。
另外,请解释如何解释以下渐变方向,如下图所示。
答案 0 :(得分:5)
您的计算是正确的,但强烈建议您不使用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-down (因为它在计算机图形学中是众所周知的)。具体来说,图像的原点位于左上角而不是左下角。
这是如何在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度。