6

J'ai une image comme ceci:Comment utiliser Haar wavelet pour détecter des LIGNES sur une image?

 CG generated bathroom

Je veux obtenir quelque chose comme ça (je ne l'ai pas dessiné toutes les lignes que je veux, mais j'espère que vous pouvez obtenir mon idée):

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

Je veux utiliser SURF ((aCCÉLÉRÉ fonctionnalités robustes) est un descripteur d'image robuste, d'abord présenté par Herbert Bay et al. en 2006) ou quelque chose qui est basée sur des montants de réponses ondelettes 2D Haar et marques un effici utilisation d'images intégrales pour trouver toutes les lignes droites sur l'image. Je veux obtenir par rapport aux coeurs de pixels d'image le début et la fin des lignes.

Donc, sur cette image pour trouver toutes les lignes entre les carreaux et ces 2 lignes noires sur le dessus.

Y a-t-il un tel exemple de code (avec la capacité de recherche de lignes) à partir duquel commencer?

I love C et C++, mais tout autre code lisible fonctionnera probablement pour moi =)

+0

double possible de http://stackoverflow.com/questions/2596722/is-there-any-super-fast-algorithm-for-finding-lines-on-picture – andand

Répondre

3

Voici un exemple complet d'application de Hough Transform pour détecter des lignes. J'utilise MATLAB pour le travail.

L'astuce consiste à diviser l'image en régions et à les traiter différemment; c'est parce que vous avez différentes "textures" dans votre scène (les carreaux sur la partie supérieure du mur sont très différents des plus foncés sur le fond, et le traitement de l'image tout à la fois ne sera pas optimal).

Comme un exemple de travail, considérez celui-ci:

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

Vous pouvez essayer la même procédure pour d'autres régions tout en accordant les paramètres pour obtenir bons résultats ..

+0

Transformée de Hough est tout à fait lent ... Et je dois travailler avec 2k vidéo en direct ... – Rella

1

Avez-vous essayé une approche plus simple comme la transformation de Hough pour trouver des lignes? Une fonction pour effectuer ceci et un exemple sont inclus dans OpenCV appelé cvHoughLines2.

+0

Il semble grille!) – Rella

0

Des transformées d'ondelettes bidimensionnelles sont implémentées dans R en utilisant le paquet waveslim. Plus précisément, la fonction dwt2D() utilise un «backend» C pour la vitesse. Vous pouvez ensuite appliquer un seuillage pour trouver les lignes.

Questions connexes