1

При вычислении ориентации градиента для использования в извлечении дескриптора HOG мы можем либо выбрать ориентацию градиента от 0 до 180, либо 0-360, как мы можем производить такие углы, используя Matlab? У меня есть следующий код:Как вычислить ориентированные и беззнаковые градиентные ориентации в 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: 
... 
+0

Вы также можете использовать 'функцию extractHOGFeatures' в компьютерном зрении инструментов системы. – Dima

ответ

2

Обычно вы можете использовать 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; 
+0

Большое спасибо за ваш быстрый ответ, я хочу спросить, что, если я хочу отображать углы от 0-360 до 0-180? – Apastrix

+1

@Apastrix - Это просто противоположное :) Найдите любые углы, которые '> 180, затем вычитайте на 360 градусов. – rayryeng

+1

@Apastrix - я обновил сообщение, чтобы сделать обратное. Взгляни. – rayryeng