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

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

 CG generated bathroom

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

 Black & White CG generated bathroom with some red lines  between tiles

Я хочу использовать SURF ((ускоренные надежные функции) - это надежный дескриптор изображения, впервые представленный Herbert Bay et al. в 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

alt text

alt text

alt text

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


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


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