6

Ich habe ein Bild wie folgt aus:Wie verwende ich das Haar-Wavelet, um Linien auf einem Bild zu erkennen? So

 CG generated bathroom

Ich möchte so etwas bekommen (ich habe alle Linien nicht gezeichnet ich will, aber ich hoffe, dass Sie meine Idee bekommen):

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

ich möchte SURF verwenden ((beschleunigt robust-Funktionen) ist ein robustes Abbilddeskriptor zunächst präsentiert von Herbert Bay et al. 2006) oder etwas, das auf Summen von 2D-Haar-Wavelet-Antworten und Marken basiert eine Effizienz Verwendung von Integralbildern zum Auffinden aller Geraden im Bild. Ich möchte relativ zu Bildpixeln Koordinaten Anfangs- und Endpunkt von Linien erhalten.

Also auf diesem Bild finden Sie alle Linien zwischen den Fliesen und diese 2 schwarzen Linien an der Spitze.

Gibt es ein solches Codebeispiel (mit Zeilensuchfunktion), von dem aus gestartet werden kann?

Ich liebe C und C++, aber andere lesbaren Code wird für mich wahrscheinlich funktionieren =)

+0

Mögliche Duplikat von http://StackOverflow.com/Questions/2596722/is-there-any-Super-Fast-algorithm-for-Finding-Lines-on-Picture – andand

Antwort

3

Im Folgenden finden Sie ein vollständiges Beispiel für die Anwendung Hough Transform zum Erkennen von Linien. Ich verwende MATLAB für den Job.

Der Trick ist, das Bild in Regionen zu teilen und jede unterschiedlich zu verarbeiten; Dies liegt daran, dass Sie unterschiedliche "Texturen" in Ihrer Szene haben (die Kacheln im oberen Bereich der Wand unterscheiden sich stark von den dunkleren am unteren Rand und die Verarbeitung des Bildes auf einmal ist nicht optimal).

Als Arbeits Beispiel betrachten wir diese:

%# 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

Sie könnten das gleiche Verfahren auch für andere Regionen versuchen, während die Parameter Tuning zu bekommen gute Ergebnisse ..

+0

Hough Transformation ist ziemlich langsam ... Und ich muss mit 2k Live-Video arbeiten ... – Rella

1

Haben Sie einen einfacheren Ansatz versucht, wie die Hough-Transformation für Linien zu finden? Eine Funktion, um dies durchzuführen, und ein Beispiel sind in OpenCV mit der Bezeichnung cvHoughLines2 enthalten.

+0

Es sieht gut aus!) – Rella

0

Zweidimensionale Wavelet-Transformationen werden in R mit dem Paket waveslim implementiert. Speziell verwendet die Funktion dwt2D() ein C "Backend" für die Geschwindigkeit. Sie können dann einen Schwellenwert anwenden, um die Linien zu finden.