Як реалізувати градієнтне перетворення Хаффа


9

Я намагаюся використовувати перетворення Хаффа для виявлення ребер і хотів би використовувати зображення градієнта як основу.

Те , що я зробив до сих пір, враховуючи зображення 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).

Новий результат


"коли я намагаюся використовувати його максимуми як параметри краю в оригінальному зображенні" Як це робиш?
ендоліт

@Jonas Due Vesterheden Цікаво, що це час допплерівського зображення частоти VS? ...
Spacey

@ Мохаммед: Не те, що я знаю. Оригінальне зображення має певну плату. Що ви маєте на увазі під "VS"?
Jonas Due Vesterheden

@JonasDueVesterheden "VS" просто означає "проти". (Час проти доплерівської частоти ') :-)
Spacey

Ви повинні згладити карту Hough, перш ніж застосувати до неї не максимальне придушення.

Відповіді:


2

Я трохи розгублений вашим запитанням. Перетворення Хока використовується для виявлення ліній, а не ребер.

Якщо все, що вам потрібно, це карта ребер, вам слід просто встановити порогову величину градієнта або використовувати щось більш фантазійне, як детектор краю Кенні.

Якщо ви хочете виявити прямі лінії, вам було б краще почати з карти краю, а потім скористатися houghфункцією, якщо панель інструментів «Обробка зображень», якщо у вас є доступ до неї. Проблема з перетворенням Хоуфа на градієнті полягає в тому, що крайові пікселі, що утворюють пряму, можуть мати протилежні орієнтації градієнта. Наприклад, розгляньте шаблон шашки. Край між двома рядами квадратів відвертає орієнтацію залежно від того, чи є у вас чорний квадрат вгорі і білий квадрат внизу, або навпаки.

Щодо вашої реалізації, я думаю, що проблема полягає в тому, що бункери у вашій матриці Hough занадто малі. По суті розмір бункера в розмірі rho дорівнює 1, а розмір відра в тета-вимірі менше 2 градусів. Це означає, що орієнтації градієнта повинні дуже точно просвічуватись, щоб утворювати лінію, що рідко трапляється на практиці. Якщо ви розміщуєте rho_idx і theta_idx так, що бункери будуть більшими, це зробить ваш детектор ліній більш толерантним до помилок, і ви можете отримати кращі лінії.


1

Я не маю поняття, чи це питання, але atan () дає лише кути від -90 до +90 градусів через неоднозначність квадранта. Для отримання повного кута градієнта (від -180 до 180) потрібно використовувати atan2 ().


Дякую за пропозицію! Наскільки я це розумію, достатньо використовувати кути від -90 до +90 градусів, оскільки "напрямки" країв значення не мають. Я спробував використовувати atan2, але, здається, це не вирішило проблеми.
Jonas Due Vesterheden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.