9
votes

Détection de ligne dans l'image

Je suis nouveau dans le traitement de l'image et j'essayais de détecter des lignes verticales à l'aide de ce code- xxx

ceci était mon image -

 Entrez la description de l'image ici

Et c'est ce que j'ai reçu après avoir interprété les opérations Entrez la description de l'image ici

Donc, ma question est pourquoi je reçois cette sortie? Il y a 10 lignes verticales si les doubles liaisons verticales sont comptées sous la forme de 2 lignes verticales distinctes.Aso Et si je veux être horizontal, vertical, 45 et -45 toutes les lignes, comment puis-je utiliser tous les 4 masques pour obtenir une seule sortie?


4 commentaires

Pouvez-vous donner un lien en ligne à cette image? Je ne peux pas le trouver sur net


J'ai édité ma question.J'ai compris mon erreur mais maintenant je reçois à nouveau une sortie inattendue.


@roni Vous pouvez enregistrer cette image à partir d'ici même si je n'ai pas de lien vers l'image maintenant.


Le problème est votre filtre, bien sûr. Enregistrez-vous des filtres de base pour obtenir un wrarp: en.wikipedia.org/wiki/prewitt_operator dech/a > en.wikipedia.org/wiki/sobel_opérateur


3 Réponses :


2
votes

Je suis toujours en train de le faire. Mais jusqu'à présent, j'ai ça. Je n'ai pas utilisé votre filtre mais plutôt un autre.

J'ai utilisé la première image que vous avez fournie. Les filtres sont décrits ici: image_filters . p>

Entrez la description de l'image ici p>

image=imread('benzene.png');  
BW = im2bw(image);
w1=(1/3)*[1 0 -1;1 0 -1;1 0 -1];
g=(imfilter(double(BW),w1));
g(g<1)=0;
imshow(g);


2 commentaires

Au lieu d'opérations morphologiques, il existe un moyen plus facile de détecter cette ligne droite (après le filtrage). Il suffit de les prendre un par un (par imlabel par exemple) et calculez la largeur sur chaque hauteur. Si c'est constant, alors sa ligne droite, sinon son bruit que vous voulez éviter /


Je pensais plus dans les lignes de la transformation de Hough. Mais je ne pouvais pas l'appliquer



14
votes

Une suggestion simple que j'ai consiste à détecter le gradient et à déterminer l'orientation d'un point de bord. N'oubliez pas que l'orientation est dans la direction qui est perpendiculaire forte> au bord. Par conséquent, si vous souhaitez trouver des lignes verticales, la direction perpendiculaire à une ligne verticale est horizontale, soit à 180 degrés, soit -180 degrés par rapport au plan cartésien. En tant que tel, pour chaque orientation des points de bord détectés, si l'orientation est soit -180 degrés, soit 180 degrés, définissez la sortie de cet emplacement pour être true code>, sinon false . Pour détecter les orientations de gradient, utilisez imgradient code> de la boîte à outils de traitement d'image pour cela. Je suppose que cela est disponible comme vous avez utilisé les deux imread code> et im2bw code> et ils font tous deux partie de cette boîte à outils:

im = imread('http://i.stack.imgur.com/bdNOt.png');
tol = 20;
[~,ang] = imgradient(im);
out = (ang >= 135 - tol & ang <= 135 + tol) | (ang >= -45 - tol & ang <= -45 + tol);
out_filter = bwareaopen(out, 50);
imshow(out_filter);


9 commentaires

Suivez-le avec out = bwareaopen (OUT, 50); (peut avoir à adapter un seuil un peu) pour supprimer les lignes liées aux lettres.


@Jonas - Tu lis mon esprit ... Je le faisais vraiment que lol. C'est aussi très drôle que vous et j'ai choisi exactement les mêmes seuils.


Une bonne réponse ne pouvait pas comprendre moi-même!


Merci beaucoup.Pour des lignes horizontales ou autres ce qui devrait être la gamme d'ang?


Horizontal sera soit 0 ou 90. Slanced doit être +/- 45 et +/- 135. Je vais mettre à jour mon message pour vous montrer plus de lignes avec la même image.


@NOBER - Je vais mettre à jour dans quelques heures. Doivent partir maintenant malheureusement!


@rayryeng pas un problème.Merci beaucoup.


@NoBer - fait. Regarde.


@rayryeng merci beaucoup.



7
votes

Une approche différente consiste à utiliser le fait que toutes les lignes qui décrivent des obligations ont le même rapport qualité / prix. Après avoir filtré l'image en laissant uniquement les obligations, nous pouvons examiner l'orientation ou dans la liste des indices qui les composent pour détecter s'ils sont verticaux ou. Tout cela peut être fait en utilisant régionProps . xxx

Entrez la description de l'image ici

Contrôler le L'histogramme montre où couper pour les lignes, les lignes ont des zones plus petites que les lettres et elles devraient avoir environ la même zone. Donc j'ai coupé pour des zones inférieures à 1000 pixels: xxx

Vous pouvez maintenant utiliser le anges et iDX pour obtenir la quelle Type de ligne que vous voulez. Par exemple, ne permettant pas de parcourir les 30 lignes de DEG: xxx

Entrée Image Description Ici

Notez qu'à l'époque où j'ai commencé à répondre à cette question, l'image que j'ai prise était le fichier benzène.png. Maintenant, je me rends compte que vous avez fourni une image différente de celle de l'original, de sorte que les lignes qui décrivent des obligations ne sont pas séparées, plutôt que vous avez des "bagues". Je vais voir plus tard si je peux aborder cela aussi si vous le souhaitez.

EDIT:

Pour trouver la ligne correspondante pour la nouvelle image, où vous avez des anneaux, la seule différence que les lignes ont, bien, ils sont des "lignes" droites et non courbées. Donc, j'ai recours à la bien-aimée transformation de Hough pour les ramasser: xxx

obtenons les angles des lignes détectées: xxx

Vous verrez ici ici angs Générera des valeurs de 0, à 60 ou 60 degrés.

Dites que vous voulez tracer uniquement ceux qui sont 0 degrés: xxx

Entrez la description de l'image ici


5 commentaires

Merci beaucoup.Mais comment avez-vous décidé de ne couper que pendant moins de 1000?


Aussi, comment puis-je utiliser angles et IDX ? Pouvez-vous donner un exemple.


Merci beaucoup .Cassualement oui, j'ai des anneaux à traiter.


J'ai ajouté la version qui répond aux anneaux aussi


Merci beaucoup.La réponse que j'ai acceptée est suffisamment bonne mais j'espérais trouver des méthodes alternatives pour obtenir le même résultat.Merci de nouveau cela a vraiment aidé.