如何在 Matlab 中计算有符号和无符号的梯度方向

How to calculate signed and unsigned Gradient orientations in Matlab

在计算HOG描述子提取的梯度方向时,我们可以选择使用0-180或0-360之间的梯度方向,我们如何使用Matlab产生这样的角度?我有以下代码:

Im=imread('cameraman.tif'); // reading the image
Im=double(Im);  // converting it to double
hx = [-1,0,1];  // the gradient kernel for x direction
hy = -hx;      // the gradient kernel for y direction
grad_x = imfilter(Im,hx);   //gradient image in x direction
grad_y = imfilter(Im,hy);   // gradient image in y direction

% angles in 0-180:
...
%angles in 0-360:
...

通常您可以使用 atan2 生成介于 -180 和 180 之间的角度,给定您的水平和垂直梯度分量,因此 signed 角度。但是,如果您想要从 0 到 360 的角度或 unsigned 角度,您所要做的就是搜索由 atan2 生成的任何负角度,然后加上 360到每一个角度。这将允许您获得 [0,360) 之间的角度。例如,-5 度角实际上是 355 度无符号。因此:

angles = atan2(grad_y, grad_x); %// Signed
angles(angles < 0) = 2*pi + angles(angles < 0); %// Unsigned

这里atan2弧度,所以我们加2*pi而不是360度。如果您想要度数而不是弧度,请使用等效的度数调用:atan2d 因此:

angles = atan2d(grad_y, grad_x); %// Signed
angles(angles < 0) = 360 + angles(angles < 0); %// Unsigned

根据您的意见,您也想反其道而行之。基本上,如果给我们一个无符号角,我们如何去一个有符号角?反其道而行之。找到所有 > 180 的角度,然后取这个角度并减去 360。例如,无符号 182 的角度是 -178 有符号,或 182 - 360 = -178。

因此:

弧度

angles(angles > pi) = angles(angles > pi) - (2*pi); 

angles(angles > 180) = angles(angles > 180) - 360;