Cercle rempli de détection à l'aide de CV2 en Python?
Je suis en train d'essayer de détecter tous les cercles dans les images comme ça.
J'ai beaucoup de différentes images comme ça, mais dans tous les cercles en noir (ou presque noir) et de la même taille (+/- un couple de pixels). Je crois qu'il y a exactement 2943 cercles dans chaque image. Ces conditions ne changent jamais. J'ai peut ne pas être en mesure de contrôler la taille des cercles à travers des images (en général comprise entre 15-45 pixels de rayon - l'image d'exemple fourni ci-dessus a un rayon de 20 et 21 pixels).
J'ai besoin d'être en mesure de détecter l'emplacement exact des centres de ces cercles avec précision et le plus précisément possible (si possible, les rayons trop).
J'ai essayé d'utiliser le cv2.HoughCircles
fonction pour le faire, mais suis très contradictoires et des résultats peu fiables. Voici le code que j'ai utilisé:
from pylab import *
import sys, cv2
filename = sys.argv[1];
img = cv2.imread(filename,0);
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR);
circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,2,15,param1=100,param2=30,minRadius=15,maxRadius=25);
circles = np.uint16(np.around(circles));
for i in circles[0,:]:
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),1);
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3);
cv2.imwrite('1-%s'%(filename),cimg)
print "%d circles found."%(len(circles[0]));
Le résultat a été cette image et cette sortie: 2806 circles found.
Il y a beaucoup de faux cercles et beaucoup de le vrai cercles ont été manqués ou ignoré.
Je commence à croire que le HoughCircle
méthode n'est pas la manière la plus optimale d'aller si tous mes cercles sont identiques en une seule image, et il pourrait y avoir un meilleur objet de la méthode de détection disponibles.
Ce que me conseillez-vous utiliser pour détecter chaque cercle avec précision à travers des milliers d'images, si je peux contrôler les propriétés des cercles assez serré?
cv2.findContours
avec cv2.CV_RETR_LIST
drapeau, devrait résulter en une liste, la longueur de qui espérons-le sera de retour le nombre de cercles.Fixe. Merci de me le dire à ce sujet. Je suis vraiment confus au sujet de pourquoi l'évidence des cercles sur le dessus sont équipés avec beaucoup de petits cercles et hors-centre.
Le lien vers l'image semble morte. Avez-vous l'esprit de poster une mise à jour du lien de l'image raw car c'est un grand poster avec un très instructive réponse.
OriginalL'auteur | 2014-02-06
Vous devez vous connecter pour publier un commentaire.
Je suis venu avec ce code, il est à l'écoute à l'image exacte que vous avez fourni, trouve 2943 les cercles dont le rayon d'estimer ainsi, en supposant que tous les cercles ont le même rayon. C'est ce qu'il produit (rognée, d'origine était trop gros):
Vous pouvez voir que ce n'est pas complètement idéal (le coin du cercle est un peu off).
Il est basé sur un seuillage et puis contour des opérations plutôt que de hough cercles.
Espère que cela aide
Bien le
findContours
fonctionne sur une image binaire. Pour cela vous avez besoin de seuil, qui permet de se débarrasser de la plupart de la bordure noire autour des cercles, mais rend les cercles de "coller" ensemble, où ils sont en contact. Ce que ledilate
n'est-il essaie de séparer ces cercles en les compressant. Si vous exécutez ce code, vous pouvez voir le résultat dans le fond de l'œil.png il produit.Pouvez-vous élaborer sur ce que ce n':
el = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
?Je vous renvoie à la OpenCV Docs mais, fondamentalement, il crée un "noyau" qui est ensuite utilisé par la suite dans la dilatation de séparer les cercles les uns des autres.
Voir ceci par exemple.
OriginalL'auteur mirosval