Frage

So habe ich ein Bild wie folgt aus:

CG erzeugt Bad

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

Black & White CG erzeugt Bad mit einigen roten Linien zwischen den Fliesen

Ich mag SURF verwenden ((beschleunigt Robust-Funktionen) ist ein robustes Abbilddeskriptor präsentierte zuerst von Herbert Bay et al. in 2006) oder etwas, das auf Summe von 2D-Haar-Wavelet-basierte Antworten und macht eine effiziente Nutzung der integralen Bilder für alle geraden Linien auf dem Bild zu finden. Ich möchte bekommen in Bezug auf Bildpixel coords Start- und Endpunkte der Linien.

So auf diesem Bild alle Linien zwischen den Fliesen zu finden und diesen zwei schwarzen Linien auf.

Gibt es ein solches Code-Beispiel (mit Linien Fähigkeit zu suchen) aus zu starten?

Ich liebe C und C ++, aber anderer lesbarer Code wird für mich wahrscheinlich Arbeit =)

War es hilfreich?

Lösung

Im Folgenden ist ein komplettes Beispiel für die Anwendung Hough-Transformation Linien zu erkennen. Ich bin mit MATLAB für den Job ..

Der Trick ist, um das Bild in Bereiche zu unterteilen und die jeweils unterschiedlich verarbeiten; dies liegt daran, dass Sie verschiedene „Texturen“ in der Szene haben (Fliesen auf dem oberen Bereich der Wand von den dunkleren auf dem Boden ganz anders sind, und die Verarbeitung des Bildes auf einmal gewohnt sein 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 der Parameter Tuning gute Ergebnisse zu erzielen ..

Andere Tipps

Haben Sie versucht, einen einfacheren Ansatz wie die Hough-Transformation für Linien zu finden? Eine Funktion dieses Beispiel auszuführen und sind enthalten in OpenCV cvHoughLines2 .

Die zweidimensionale Wavelet-Transformationen sind in R implementiert das Paket mit waveslim . Insbesondere verwendet die Funktion dwt2D () einen C „backend“ für die Geschwindigkeit. Sie können dann gelten Schwellwertbildung die Linien zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top