Je suis nouveau dans le traitement de l'image et j'essayais de détecter des lignes verticales à l'aide de ce code- ceci était mon image - p> Et c'est ce que j'ai reçu après avoir interprété les opérations
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? p> p> p>
p>
3 Réponses :
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>
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);
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 code> 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
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 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);
Suivez-le avec out = bwareaopen (OUT, 50); CODE> (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.
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 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: p> Vous pouvez maintenant utiliser le 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. p> 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: p> obtenons les angles des lignes détectées: p> Vous verrez ici ici Dites que vous voulez tracer uniquement ceux qui sont 0 degrés: p> régionProps code>.
P>
anges code> et
iDX code> pour obtenir la quelle Type de ligne que vous voulez. Par exemple, ne permettant pas de parcourir les 30 lignes de DEG: p>
P>
angs code > Générera des valeurs de 0, à 60 ou 60 degrés. P>
p> p>
Merci beaucoup.Mais comment avez-vous décidé de ne couper que pendant moins de 1000?
Aussi, comment puis-je utiliser angles code> et
IDX code>? 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é.
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