Я пытаюсь использовать преобразование Хафа для обнаружения краев и хотел бы использовать градиентные изображения в качестве основы.
То , что я сделал до сих пор, учитывая изображение I
размера [M,N]
и ее частных производных gx
, gy
, чтобы вычислить угол градиента в каждом пикселе , как thetas = atan(gy(x,y) ./ gx
. Точно так же я вычисляю величину градиента как magnitudes = sqrt(gx.^2+gy.^2)
.
Для построения преобразования Хафа я использую следующий код MATLAB:
max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
for y=1:N
theta = thetas(x,y);
rho = x*cos(theta) + y*sin(theta);
rho_idx = round(rho)+max_rho;
theta_idx = floor((theta + pi/2) / pi * 100) + 1;
hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
end
end
Результирующее преобразование Хафа выглядит правдоподобно (см. Http://i.stack.imgur.com/hC9mP.png ), но когда я пытаюсь использовать его максимумы в качестве параметров края в исходном изображении, результаты выглядят более или менее случайными. Я сделал что-то не так при построении преобразования Хафа?
ОБНОВЛЕНИЕ : у меня была глупая ошибка в моем коде: rho
был вычислен как x*cos(theta)+y*cos(theta)
вместо x*cos(theta)+y*sin(theta)
. То есть я использовал два косинуса вместо косинуса и синуса. Я отредактировал код выше и новое полученное изображение ниже. Это не дало намного лучшие края все же.
@endolith: Чтобы построить ребро, учитывая максимальное значение в hough
-матрице в rho_idx, theta_idx
, я перевожу индексы в rho,theta
значения:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
Наконец я рисую край как y= (rho - x*cos(theta)) / sin(theta)
.