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?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kam ich mit diesem code, es ist optimiert, um die genaue Bild, das Sie geliefert haben, findet 2943 Kreise mit dem radius Schätzung sowie, davon ausgehend, dass alle Kreise den gleichen radius haben. Dies ist, was Sie produziert (beschnitten, original war zu groß):
Können Sie sehen, dass Ihr nicht ganz ideal (die Ecke Kreis ist ein bisschen off).
Ist es um schwellenwertbestimmung und dann Kontur Operationen statt hough circles.
Hoffe es hilft
Auch die
findContours
arbeitet auf einem binären Bild. Für die, die Sie benötigen, um die Schwelle, die loszuwerden, die meisten schwarzen Rand haben Sie rund um die Kreise, sondern macht Kreise "kleben" zusammen, wo Sie sich berühren. Was diedilate
tut, ist es versucht zu trennen, diese Kreise vom schrumpfen Sie. Wenn Sie dies ausführen, können Sie sehen, das Ergebnis in die geweitete.png erzeugt.Können Sie näher erläutern, was dies bedeutet:
el = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
?Ich würde verweisen Sie auf die OpenCV-Docs aber im Grunde ist es erzeugt eine "kernel", der dann anschließend in der Erweiterung zu trennen, die Kreise von einander.
Siehe dieser zum Beispiel.
InformationsquelleAutor mirosval