2015-06-04 2 views
4

Я пытаюсь воссоздать функцию Hough MATLAB с моей. Мой код следуетРазница между MATLAB hough и моей реализацией

function [H,T,R] = my_hough(x,dr,dtheta) 
    rows = size(x,1); 
    cols = size(x,2); 
    D = sqrt((rows - 1)^2 + (cols - 1)^2); 
    Nr = 2*(ceil(D/dr)) + 1; 
    diagonal = dr*ceil(D/dr); 
    R = -diagonal:dr:diagonal; 
    T = -90:dtheta:90-dtheta; 
    Ntheta = length(T); 
    H = zeros(Nr,Ntheta); 
    for i = 1:Ntheta 
     for n1 = 1:rows 
      for n2 = 1:cols 
       if x(n1,n2)==1 
        r = n2*cos(T(i)*pi/180) + n1*sin(T(i)*pi/180); 
        [~,j] = min(abs(R-ones(1,Nr)*r)); 
        H(j,i) = H(j,i) + 1; 
       end 
      end 
     end  
    end 
end 

где dr и dtheta являются расстояние и угловое разрешение. Печать разницы между моей таблицей Hough и MATLAB есть много нулей, но есть и некоторые ненулевые элементы. Любая идея, почему это происходит?

+0

Я не понял полностью: массив тета должен быть декрементирован тетой, но массив rho не уменьшен rho? –

+1

Я не уверен в этом ... Я просто попытался следовать алгоритму, описанному на http://www.mathworks.com/help/images/ref/hough.html – Controller

+0

У меня не было подписи. В октаве говорят: «T = -90: dtheta: 90-dtheta;» дает массив до включения '90-dtheta' (как в данной ссылке). Например, с 'dtheta = 1' это' [-90, -89, ..., 88, 89]; ' –

ответ

2

Ну, на самом деле это было очень нелепая ошибка ...

r = n2*cos(T(i)*pi/180) + n1*sin(T(i)*pi/180); 

должен быть

r = (n2-1)*cos(T(i)*pi/180) + (n1-1)*sin(T(i)*pi/180); 

Благодаря этой странной индексации MATLAB.

+0

Кроме того, вы можете либо исключить преобразование в радианы, используя 'cosd()' и 'sind()', либо использовать 'degtorad()' для преобразования градусов для радианов, что делает для более чистого кода. –

Смежные вопросы