2017-07-25 3 views
5

Ich habe ein Bild, in dem ich versuche, Hough Kreis verwandelt sich auf die kreisförmigen Objekte in Aussicht.Hough Kreis in kreisförmigen Schatten transformieren

Ich habe Schwierigkeiten, einen Kreis zu finden, der dem äußeren Schatten des Zylinders entspricht. Was kann getan werden, um diesen Schatten richtig zu segmentieren und leicht einen Kreis daran anzupassen?

Code:

img = cv2.medianBlur(im,7) 
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

plt.imshow(cimg) 
plt.show() 

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20, 
          param1=50,param2=150,minRadius=100,maxRadius=0) 

circles = np.uint16(np.around(circles)) 

for i in circles[0,:]: 
    # draw the outer circle 
    cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),10) 
    # draw the center of the circle 
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),20) 

    radius = i[2] 
    print 'radius', radius, 'px' 

plt.imshow(cimg) 
plt.show() 
+0

Sie meinen, dass "Halbmond" an oben im Bild? – Micka

+0

Ja - der dunkle Schatten in der oberen Hälfte des Bildes. – Sam

+0

Können Sie das Eingabebild bereitstellen? –

Antwort

2

Ich werde nur den Code schreiben und nicht durchgehen, weil es eine Menge Funktionen gibt und ich würde hassen, anzunehmen, was du weißt oder nicht weißt und eine lange Zeit damit verbringst, das Aufschreiben zu machen. Wenn Sie irgendwelche Fragen haben, zögern Sie nicht zu fragen, und ich werde sie in der Post hinzufügen.

Sie haben gebeten, einen Kreis an die Halbmondschatten anzupassen, also habe ich Kreise in die Schatten eingepasst. Es ist wichtig zu erkennen, dass in einer Art von Produktionscode, der, wie ich mir vorstelle, eine Menge Bilder dieser Art verarbeiten müsste, es notwendig wäre, die angepassten Kreise zu verfeinern. Insbesondere ist jede Art von Strukturanalyse dieses Typs nur besorgt über die Anpassung der gegebenen Form an die Pixel, nicht, dass das Objekt in Frage ist, was Sie suchen.

Ich habe absichtlich den falsch eingepassten Kreis dort drin gelassen. Ich würde für die Konvexe Hülle empfehlen, oder Haar-Detektor oder Formschluss je nachdem, was genau sind Sie interessiert.

import cv2 
import numpy as np 

img = cv2.imread("orig.png", cv2.IMREAD_GRAYSCALE) 

ret, thresh = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY_INV) 

ero = cv2.erode(thresh, np.ones((5,5))) 
dil = cv2.dilate(ero, np.ones((5,5))) 

img, contours, hierarchy = cv2.findContours(dil, cv2.RETR_EXTERNAL, 
              cv2.CHAIN_APPROX_NONE) 

#just for drawing purposes, the cimg is not really required 
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 
for cnt in contours: 
    (x, y), radius = cv2.minEnclosingCircle(cnt) 
    center = (int(x), int(y)) 
    radius = int(radius) 
    cv2.circle(cimg, center, radius, (255, 0, 0), 1) 

Das Ausgangsbild war ich

enter image description here

bekam

Beide Halbmonde ausgestattet sind, mit der Unterseite passend zu der Außenseite des Tanks und nicht die Mondsichel genau. Sie könnten eine Art Hysterese-Tracking durchführen und den Kreis verschieben, bis der äußere Rand genau halbmondförmig ist.

Es gibt einen zusätzlichen Kreis, der entfernt werden kann, wenn Sie die Parameter genau stimmen, aber das Filtern der genauen Kreise, die Sie benötigen, liegt bei Ihnen. F. e. Wenn Sie nur den oberen Halbmond nach der kleinsten y Koordinate fragen möchten, wenn alle Schatten so groß wie diese sind, können Sie nur nach Radienkreisen fragen, die größer sind als ein bestimmter Schwellenwert usw.

2

Der Schatten Sie Segment mit Abstand die dunkelsten Region suchen sind. Ich würde einen Schwellenwert verwenden, um alle helleren Pixel herauszufiltern. Wenn es Rauschen gibt, würde ich Connected Components verwenden, um den größten "Blob" zu finden. Sobald nur noch der Schatten übrig ist und alle anderen Pixel auf 0 gesetzt sind, würde ich den MinEnclosingCircle ausprobieren, den Dhanushka oben empfohlen hat.

Verwandte Themen