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:

Erkennen, berühren/überlappenden Kreise/Ellipsen mit OpenCV und Python

Nachdem ich die üblichen Sachen wie color2gray, schwellenwertbestimmung und Grenze-Erkennung, bekomme ich Folgendes Bild, wie gezeigt:

Erkennen, berühren/überlappenden Kreise/Ellipsen mit OpenCV und Python

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:

Erkennen, berühren/überlappenden Kreise/Ellipsen mit OpenCV und Python

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
InformationsquelleAutor Merlin | 2014-11-14
Schreibe einen Kommentar