3

在计算用于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:
...
4

1 回答 1

3

通常,您可以使用atan2在给定水平和垂直梯度分量的情况下生成介于 -180 和 180 之间的角度,从而生成带符号的角度。但是,如果您想要从 0 到 360 的角度或无符号角度,您所要做的就是搜索由其生成的任何角度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;
于 2015-02-26T16:29:37.537 回答