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é?

Votre résultat de l'image donne 404. À partir de l'image initiale, nous pouvons voir que l'un de vos cercles sont en contact avec chaque autre, de sorte qu'un début, je ne l'utiliserais morphologiques de l'opérateur à s'éroder l'image. Puis il suffit de 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