Как использовать вейвлет Хаара для обнаружения ЛИНИЙ на изображении?

Итак, у меня есть изображение, подобное этому:

CG генерируется ванная комната

Я хочу получить что-то вроде этого (я не нарисовал все линии, которые я хочу, но я надеюсь, что вы можете понять мою идею):

Черно-белая компьютерная графика с красной линией между плитками

Я хочу использовать SURF ( (Speeded Up Robust Features) - надежный дескриптор изображения, впервые представленный Гербертом Бэй и др. В 2006 году) или что-то, что основано на суммах 2D-вейвлет-откликов Хаара и эффективно использует интегральные изображения для найти все прямые линии на изображении. Я хочу получить относительно координат точек изображения начала и конца линий.

Так что на этом рисунке можно найти все линии между плитками и этими 2 черными линиями сверху.

Есть ли такой пример кода (с возможностью поиска строк) для начала?

Я люблю C и C++, но любой другой читаемый код, вероятно, будет работать для меня =)

3 ответа

Решение

Ниже приведен полный пример применения преобразования Хафа для обнаружения линий. Я использую MATLAB для работы..

Хитрость заключается в том, чтобы разделить изображение на области и обрабатывать каждую по-разному; это потому, что у вас есть разные "текстуры" в вашей сцене (плитки в верхней области стены сильно отличаются от темных в нижней части, и обработка изображения сразу не будет оптимальной).

В качестве рабочего примера рассмотрим этот:

%# load image, blur it, then find edges
I0  = rgb2gray( imread('http://www.de-viz.ru/catalog/new2/Holm/hvannaya.jpg') );
I = imcrop(I0, [577 156 220 292]);     %# select a region of interest
I = imfilter(I, fspecial('gaussian', [7 7], 1), 'symmetric');
BW = edge(I, 'canny');

%# Hough Transform and show accumulated matrix
[H T R] = hough(BW, 'RhoResolution',2, 'Theta',-90:0.5:89.5);
imshow(imadjust(mat2gray(H)), [], 'XData',T, 'YData',R, ...
       'InitialMagnification','fit')
xlabel('\theta (degrees)'), ylabel('\rho')
axis on, axis normal, colormap(hot), colorbar, hold on

%# detect peaks
P  = houghpeaks(H, 20, 'threshold',ceil(0.5*max(H(:))));
plot(T(P(:,2)), R(P(:,1)), 'gs', 'LineWidth',2);

%# detect lines and overlay on top of image
lines = houghlines(BW, T, R, P, 'FillGap',50, 'MinLength',5);
figure, imshow(I), hold on
for k = 1:length(lines)
    xy = [lines(k).point1; lines(k).point2];
    plot(xy(:,1), xy(:,2), 'g.-', 'LineWidth',2);
end
hold off

альтернативный текст

альтернативный текст

альтернативный текст

Вы можете попробовать ту же процедуру для других регионов при настройке параметров, чтобы получить хорошие результаты.

Вы пробовали более простой подход, такой как преобразование Хафа для поиска линий? Функция для выполнения этого и пример включены в OpenCV с именем cvHoughLines2.

Двумерные вейвлет-преобразования реализуются в R с использованием пакета wavelim. В частности, функция dwt2D() использует C "backend" для скорости. Затем вы можете применить пороговое значение, чтобы найти линии.

Другие вопросы по тегам