Erkennen, berühren/überlappenden Kreise/Ellipsen mit OpenCV und Python
möchte ich zum Messen der Rundheit von Kreisen (Unterschied von den "Kreisen", Höhe und Breite-oder ellipse-Parameter). Die Kreise sind in Bildern wie hier gezeigt:
Nachdem ich die üblichen Sachen wie color2gray, schwellenwertbestimmung und Grenze-Erkennung, bekomme ich Folgendes Bild, wie gezeigt:
Mit dabei, ich habe bereits versucht, eine Menge verschiedener Dinge:
- Listenelement Wasserscheide mit findContour (ähnlich diese Frage) -> openCV erkennt den Raum zwischen den Kreisen, die als eine geschlossene Kontur und nicht die Kreise, da Sie zusammen kleben nicht bilden eine geschlossene Kontur
- gleiche problem mit fitEllipse. Ich bekomme Ellipsen montiert auf dem schwarzen hintergrund Kontur und nicht dazwischen.
- nur versucht, hough-transforamtion (wie im code-und im Dritten Bild gezeigt) sowie führt zu merkwürdigen Ergebnissen:
Finden Sie den code hier ein:
import sys
import cv2
import numpy
from scipy.ndimage import label
# Application entry point
#img = cv2.imread("02_adj_grey.jpg")
img = cv2.imread("fuss02.jpg")
# Pre-processing.
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("SO_0_gray.png", img_gray)
#_, img_bin = cv2.threshold(img_gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)
_, img_bin = cv2.threshold(img_gray, 170, 255, cv2.THRESH_BINARY)
cv2.imwrite("SO_1_threshold.png", img_bin)
#blur = cv2.GaussianBlur(img,(5,5),0)
img_bin = cv2.morphologyEx(img_bin, cv2.MORPH_CLOSE, numpy.ones((3, 3), dtype=int))
cv2.imwrite("SO_2_img_bin_morphoEx.png", img_bin)
border = img_bin - cv2.erode(img_bin, None)
cv2.imwrite("SO_3_border.png", border)
circles = cv2.HoughCircles(border,cv2.cv.CV_HOUGH_GRADIENT,50,80, param1=80,param2=40,minRadius=10,maxRadius=150)
print circles
cimg = img
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.putText(cimg,str(i[0])+str(',')+str(i[1]), (i[0],i[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 255)
cv2.imwrite("SO_8_cimg.png", cimg)
Hat jemand eine Idee zur Verbesserung meiner algorhitm oder einen komplett anderen Ansatz? Ich habe versucht viele verschiedene Ansätze, aber ohne Glück so weit. Danke an alle für Eure Hilfe.
- Haben Sie ein problem mit dem extrahieren der Kreise aus dem Bild? Ich verstehe nicht ganz Folgen, was Sie wollen.
- Ja, ich bin nicht in der Lage, Sie zu trennen die Kreise, wie Sie sehen können, in den Rand-Erkennung Bild oben. Viele der Grenzen, die verloren gehen während der Filterung etc.
- Ich habe einige Ideen. Geben Sie mir ein wenig
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist mein Versuch der Aufdeckung der Kreise. Zusammenfassend
V Kanal:
dist Bild:
temp Bild:
dist * temp Bild:
Schwellenwertbestimmung Vorlage abgestimmt Bild:
Erkennung von Kreisen, die als lokale maxima:
Habe ich diesen in C++, wie ich mich am wohlsten fühle mit ihm. Ich denke, Sie können leicht umwandeln diese zu python, wenn Sie diese nützlich finden. Beachten Sie, dass die oben genannten Bilder sind nicht maßstabsgetreu. Hoffe, das hilft.
EDIT: Hinzugefügt wurde die Python-version
C++:
Python:
Habe ich einige Fehler mit dem code @dhanuskha. Ich denke, weil ich bin mit einer anderen version der CV. Dieser code funktioniert mit CV 3.0, wenn Sie es brauchen.