如何在 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;
在计算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;