Gefüllter Kreis-Erkennung mit CV2 in Python?

Ich versuche zu erkennen, dass alle Kreise in Bilder wie dieses.

Ich habe viele verschiedene Bilder wie dieses, aber in den Kreisen werden schwarz (oder fast schwarz) und die gleiche Größe (+/- ein paar Pixel). Ich glaube, es sind genau 2943 Kreise in jedem Bild. Diese Bedingungen ändern sich nie. Ich möglicherweise nicht in der Lage zu kontrollieren die Größen der Kreise über Bilder (in der Regel im Bereich zwischen 15 und 45 Pixel in der Radien - die Beispiel-Bild oben hat Radien von 20-21 Pixel).

Ich muss in der Lage sein, zu erkennen, die genauen Standorte der Zentren dieser Kreise so genau und präzise wie möglich (wenn möglich, die Radien zu).

Ich habe versucht mit der cv2.HoughCircles Funktion zu tun, bekam aber sehr inkonsistente und unzuverlässige Ergebnisse. Hier ist der code, den ich verwendet habe:

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]));

Das Ergebnis war dieses Bild und diese Ausgabe: 2806 circles found.

Gibt es viele falsche Kreise und viele der wahre Kreise wurden übersehen/ignoriert.

Bin ich angefangen zu glauben, dass die HoughCircle Methode ist nicht der optimale Weg zu gehen, wenn alle meine Kreise identisch sind, in einem einzigen Bild, und es könnte einige bessere Objekt-detection-Methode zur Verfügung.

Was schlagen Sie vor, ich nutzen, um zu erkennen, jeden Kreis und exakt über Tausende von Bildern, wenn ich die volle Kontrolle über die Eigenschaften der Kreise, dicht genug?

Ihr Ergebnis Bild gibt 404. Aus dem ersten Bild können wir sehen, dass Ihre Kreise sich berühren einander, so als start würde ich verwenden morphologischen operator Erodieren das Bild. Dann einfach cv2.findContours mit cv2.CV_RETR_LIST Flagge, sollte das Ergebnis in einer Liste die Länge hoffentlich wird wieder die Anzahl der Kreise.
Behoben. Vielen Dank für das erzählen mich über, die. Ich bin wirklich verwirrt darüber, warum die OFFENSICHTLICHE Kreise auf der Oberseite sind ausgestattet mit wesentlich kleineren Kreisen und off-Zentrum zu.
Der link zu dem Bild scheint tot. Tun Sie etwas dagegen Veröffentlichung einer aktualisierten link zu den raw-Bild, da ist das so ein toller post mit wirklich sehr lehrreiche Antwort.

InformationsquelleAutor | 2014-02-06

Schreibe einen Kommentar