2017-07-25 55 views
5

Mam obraz, w którym próbuję zastosować transformaty okręgu Hough do okrągłych obiektów w widoku.Hough circle circle to circular shadow

Mam trudności ze znalezieniem okręgu, który pasuje do zewnętrznego cienia cyklonu. Co można zrobić, aby odpowiednio posegmentować ten cień i łatwo dopasować do niego okrąg?

Kod:

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

masz na myśli ten obszar "półksiężyca" o wierzchołek na obrazie? – Micka

+0

Tak - ciemny cień obecny w górnej połowie obrazu. – Sam

+0

Czy możesz podać obraz wejściowy? –

Odpowiedz

2

Zamierzam tylko napisać kod i nie przechodzić przez niego, ponieważ jest wiele funkcji i nie chciałbym przyjmować tego, co wiesz lub nie wiesz i spędzić dużo czasu na pisaniu. Jeśli masz , możesz zadawać dowolne pytania o numer, a dodam je do posta.

Poprosiłeś o dopasowanie koła do cienie półksiężyca, więc dopasowałem kręgi do cieni. Ważne jest, aby zdać sobie sprawę, że w jakimś kodzie produkcyjnym, który, jak sądzę, będę musiał przetwarzać wiele obrazów tego rodzaju, konieczne byłoby udoskonalenie dopasowanych okręgów. W szczególności każdy rodzaj analizy strukturalnej tego typu obawia się tylko dopasowania danego kształtu do pikseli, a nie, że przedmiot, którego szukasz, jest tym, czego szukasz.

Celowo zostawiłem tam źle dopasowane koło. Proponuję udać się do otoczka wypukła, lub detektor Haar lub kształt pasujący w zależności od tego, co dokładnie jesteś zainteresowany.

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) 

Wyjście obrazu Dostałem

enter image description here

Oba półksiężyce są wyposażone poprawnie z dolnym pasującym do zewnętrznej strony zbiornika, a nie do półksiężyca dokładnie. Możesz zrobić coś w rodzaju śledzenia histerezy i przesuwać ten krąg, aż jego zewnętrzna krawędź znajdzie się dokładnie w półksiężycu dość konsekwentnie.

Istnieje dodatkowe koło, które można usunąć, jeśli dostroisz parametry w prawidłowy sposób, ale odfiltrowanie dokładnie wybranych kół zależy od Ciebie. F.e. jeśli chcesz tylko najwyższego półksiężyca, zapytaj o najmniejszą współrzędną y, jeśli wszystkie cienie są tak duże, jak te, możesz poprosić o tylko koła o promieniu większym niż próg itd.

2

Cień szukasz segmentu jest zdecydowanie najciemniejszego regionu. Chciałbym użyć progu, aby odfiltrować wszystkie piksele, które są jaśniejsze. Jeśli pozostaną hałasy, użyłbym połączonych komponentów, aby znaleźć największy "blob". Gdy cień jest jedyną pozostałością, a wszystkie pozostałe piksele są ustawione na 0, chciałbym wypróbować MinEnclosingCircle, który dhanushka zalecił powyżej.