2013-09-05 16 views
5

Poszukuję najlepszej metody Adaptive Threshold do binaryzacji obrazów. Ale mam problemy z ciemnym i rozmytym obrazem. Obraz
Wejście:
Let the Image load...Próg adaptacyjny z rozmytym obrazem

i kiedy używać metody adaptacyjnego progu otrzymam ten
obrazu wyjściowego:
Let the Image load...

To nie jest dobre dla mnie!
Czy ktoś mógłby mi pomóc rozwiązać ten problem?


inny obraz: enter image description here

oraz: enter image description here

pierwszy wydaje się bardzo źle z @ Hammer'solution (muszę wybrał c kanał), drugi mogę używać próg adaptacyjny normalne.
, więc chcę znaleźć najlepsze rozwiązanie dla wszystkich przypadków.

dziękuję ponownie!

Odpowiedz

7

Wygląda na to, że kolor jest znacznie lepszym wskaźnikiem dla segmentacji obrazu niż intensywności. Spróbuj przekonwertować go na HSV, a następnie uruchomić OTSU na kanale H.

w Pythonie

hsv = cv2.cvtColor(image, cv2.cv.CV_BGR2HSV) 
cv2.imshow('hsv', hsv[:,:,0]) 
(thresh, im_bw) = cv2.threshold(hsv[:,:,0], 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) 
cv2.imshow('OTSU', im_bw) 

daje (HSV)

enter image description here

a następnie (Otsu)

enter image description here

Trochę erozji i dylatacji i powinno być dobrze przejść na

+0

tak, Hammer Dziękuję za pytanie. to wydaje się dobre dla tego przypadku i złe dla każdego. więc jak mogę wybrać najlepsze rozwiązanie? dziękuję! – minhthuan

+0

@minhuan Jaka jest różnica między tym dobrym a innym złym? Pokaż kilka zdjęć, które nie pasują do rozwiązania Hammera. – WangYudong

+0

Dobra odpowiedź. A co z wyborem progów, aby uzyskać wiele poziomów? Istnieje już trochę magii OpenCv? – CapelliC

1

Jeśli pojedynczy próg nie wystarcza do rozdzielenia wszystkich obrazów, można wypróbować wartość Watershed algorithm z dwoma progami.

Użyj wysokiego progu, aby uzyskać obraz z segmentami, które są zdecydowanie częścią cyfry, oraz wysoki próg odwrotny do uzyskania obrazu z segmentami, które zdecydowanie nie są częścią cyfry.

Erode oba obrazy nieco, aby zwiększyć pewność.

Następnie użyj dwóch zdjęć jako nasion dla Zlewiska.

Here is an answer where this is done

2

Możesz być zainteresowany these adaptacyjnych progów stosowanych przez OpenCV.

Użyłem średniego progu adaptacyjnego. Być może będziesz musiał grać trochę z parametrami, ale jeśli twoje obrazy są podobne (ten sam rozmiar itp.), Mam nadzieję, że nie będzie to wymagało zbytniego podkręcania.

# Smooth image 
filtered = cv2.adaptiveThreshold(input_image.astype(np.uint8), 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 41, 3) 

# Some morphology to clean up image 
kernel = np.ones((5,5), np.uint8) 
opening = cv2.morphologyEx(filtered, cv2.MORPH_OPEN, kernel) 
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel) 

Wyniki:

enter image description here

enter image description here

enter image description here

1

Poniższy kod ...

im=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,111,3) 
cv2.imshow('mkm',im)` 

... daje dobry wynik:

adaptive image