Как использовать вейвлет Haar для обнаружения СТРОК на изображении?

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

 CG generated bathroom

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

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

Я хочу использовать ПЕРЕМЕЩЕНИЕ ((Ускоренные Устойчивые Функции) устойчивый дескриптор изображения, сначала представленный Herbert Bay и др. в 2006), или что-то, что основано на суммах 2D ответов вейвлета Haar и делает эффективное использование интегральных изображений для нахождения всех прямых линий на изображении. Я хочу добраться относительно пиксельных проводов изображения, запускаются и конечные точки строк.

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

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

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

7
задан hippietrail 8 August 2017 в 00:00
поделиться

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

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

4
ответ дан 7 December 2019 в 12:17
поделиться

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

1
ответ дан 7 December 2019 в 12:17
поделиться

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

0
ответ дан 7 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: