Question

J'ai une image comme ceci:

CG généré salle de bain

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):

Noir et blanc CG généré salle de bains avec des lignes rouges entre les carreaux

Je veux utiliser SURF ((ACCÉLÉRÉ fonctionnalités robustes) est un descripteur d'image robuste, d'abord présenté par Bay Herbert et al. en 2006) ou quelque chose qui est basée sur des sommes d'ondelettes 2D Haar réponses et fait une utilisation efficace des images intégrales pour trouver toutes les lignes droites sur l'image. Je veux par rapport à l'image coords pixel points de début et de fin de lignes.

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

Y at-il un tel Exemple de code (avec une capacité de recherche de lignes) à partir?

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

Était-ce utile?

La solution

Ce qui suit est un exemple complet de l'application Hough Transform pour détecter les lignes. Je Matlab pour le travail ..

L'astuce consiste à diviser l'image en régions chacune différemment et processus; c'est parce que vous avez différentes « textures » dans votre scène (tuiles sur la partie supérieure du mur sont tout à fait différentes de celles plus sombres sur le fond, et le traitement de l'image à la fois ne sera pas optimale).

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

text alt

text alt

text alt

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

Autres conseils

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

transformées en ondelettes à deux dimensions sont mis en oeuvre en utilisant le package R waveslim . Plus précisément, le dwt2D () fonction utilise un « back-end » C pour la vitesse. Vous pouvez ensuite appliquer seuillage pour trouver les lignes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top