Nav*_*ony 6 matlab gradient image-processing
我找到了图像的渐变.现在我只是使用5 x 5图像.我更感兴趣的是找到渐变的方向,但我没有在纸上手动获得结果,因为我使用MATLAB函数得到它们imgradient.请参考以下图像以了解有关输入图像的更多信息以及此处用于查找图像渐变的Sobel滤镜.这里使用的3 x 3 sobel运算符之一就是我使用该功能的运算符
f1 = fspecial('sobel');
Run Code Online (Sandbox Code Playgroud)
而另一个是通过转置而获得的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
Run Code Online (Sandbox Code Playgroud)
请注意,执行输出的负数fspecial以及该行提供的注释.这是为了确保检测水平边缘(即Gy)的掩模为y-down(因为它在计算机图形学中是众所周知的).具体来说,图像的原点位于左上角而不是左下角.
这是坐标系如何在y下方布局的图形表示:

来源:维基百科 - 旋转矩阵
因此,当找到方向时,还需要确保梯度方向的角度相对于我们习惯的y-up坐标系.因此,当你发现的梯度方向的角度,需要否定的y计算角度,这个角度是相对于不是标准的约定之前的坐标.
追求您所寻求的梯度的定义是传统的y坐标系统从下到上逐渐增加.否定是必需的,事实上,如果您检查源代码imgradient,这正是在代码的第127行(版本R2015a)所做的:
Gdir = atan2(-Gy,Gx)*180/pi; %// Radians to degrees
Run Code Online (Sandbox Code Playgroud)
您可能会问自己为什么需要否定遮罩并y在找到方向后再次否定坐标.之所以如此,是因为修改后的蒙版需要正确捕捉渐变的大小,所以我们一旦否定蒙版并找到渐变幅度,然后我们否定y坐标,这样我们就可以找到相对于传统坐标系的角度.
在您的情况下,给定Gx = 765和Gy = -765,将这些数量代入上面的等式得出:
>> Gy = 765;
>> Gx = -765;
>> Gdir = atan2(-Gy,Gx)*180/pi
Gdir =
-135
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为梯度方向对应于朝向最大变化率的方向.-135度意味着我们指向西南部,这是有意义的,因为我们正在从暗像素进展到像素.
现在,如果您查阅第三个示例图像,报告的角度imgradient确实是正确的.只需从暗区到亮区绘制一条直线,看看它与x轴的对齐方向与向右增加的列对齐.当我们从下到上移动以跟随暗区和光时,第一个+90度的角度是有意义的.这与图像反转的情况类似.第三种情况是我们之前看到的情况,第四种情况只是旋转了180度的第三种情况,因此从黑暗到光的方向角度现在是+45度,而之前是-135度.