Я намагаюся використовувати перетворення Хаффа для виявлення ребер і хотів би використовувати зображення градієнта як основу.
Те , що я зробив до сих пір, враховуючи зображення I
розміру [M,N]
і її приватних похідних gx
, gy
, щоб обчислити кут градієнта в кожному пікселі , як thetas = atan(gy(x,y) ./ gx
. Аналогічно обчислюю градієнтну величину як magnitudes = sqrt(gx.^2+gy.^2)
.
Для побудови перетворення Hough я використовую такий код 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
-matrix у 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)
.