2013-12-16 12 views
5

I po 2-D Watershed example mathworks.com w celu oddzielenia połączonych przedmiotów, jak na rysunku poniżej:Nadmierne segmentacji Watershed algorytmu

Imgur

Kod jest podsumować jako:

bw = imread('some_binary_image.tif'); 

D = -bwdist(~bw); 

D(~bw) = -Inf; 

L = watershed(D); 

Wynik:

Imgur

Cząstka w środku została podzielona na dwie części. Czy są tutaj jakieś sposoby na uniknięcie nadmiernej segmentacji?

Dzięki, lennon310, chessboard działa dobrze dla większości moich zdjęć, ale nadal istnieją pewne przypadki, że nie. Na przykład, następujący binarny obraz: Imgur

Korzystanie szachownicę spowoduje: Imgur

Jak mam setki obrazów, wydaje się, że trudno jest znaleźć jedną kombinację parametrów, które pracują dla wszystkich zdjęć . Zastanawiam się, czy muszę połączyć dobre wyniki dostał z użyciem szachownicy, cityblock, etc ...

+0

jaki jest twój cel setek przetwarzania obrazu? nie jest konieczne używanie działu wodnego do wydobywania obiektów. Ponieważ na obrazie znajdują się małe połączenia między dwoma okręgami, podstawowa metoda oznaczania podłączonych komponentów może również nie działać. W rzeczywistości są to wykrywacze okręgów (hough, imfindcircles, ...) w przyborniku do obróbki obrazów matlab. – lennon310

+0

@ lennon310: Są to w rzeczywistości obrazy wykonane przez tomografię rentgenowską. Chcę stworzyć maskę dla cząstki, która mnie interesuje. Obecnie używam Connected Threshold Grower w ImageJ, który może znaleźć podłączony region z punktu seed.Ustawiając punkt wysiewu na interesującej nas cząstce, Connected Threshold Grower może wytworzyć wynik, który zawiera tylko tę cząstkę, jeśli nie dotyka innych cząstek. Teraz ręcznie usuwam krawędź dotykającą setek obrazów, co jest czasochłonne. Próbuję użyć działu wodnego, aby automatycznie oddzielić te cząstki. – shapeare

+0

Zdjęcia rentgenowskie nie są obrazami binarnymi, czyż nie? Myślę, że połączony komponent może zostać wykryty, a nawet algorytm klastrowania jest wart próbowania na surowych obrazach w oparciu o różnicę intensywności. W przypadku obrazu binarnego, szczególnie zaktualizowanego, trudno jest podzielić na segmenty dwa faktycznie połączone kręgi. – lennon310

Odpowiedz

7

Zastosowanie max(abs(x1-x2),abs(y1-y2)) jako odległość metrycznym (szachownicy) i użyć ośmiu połączony sąsiedztwo w watershed funkcję:

bw=im2bw(I); 

D = -bwdist(~bw,'chessboard'); 
imagesc(D) 
D(~bw) = -Inf; 

L = watershed(D,8); 
figure,imagesc(L) 

Wynik: enter image description here

3

mam do czynienia z tym samym numerze na chwilę. Dla mnie rozwiązaniem było użycie metody wodomierza opartego na markerach. Wygląda na przykładach dotyczących sposobu zlewni podanych na blogu Matlab przez Steve: http://blogs.mathworks.com/steve/ Ta metoda podana przez niego pracowały dla mnie najlepsze: http://blogs.mathworks.com/steve/2013/11/19/watershed-transform-question-from-tech-support/

Teraz, w idealnym świecie, bylibyśmy w stanie segmentu wszystko prawidłowo za pomocą jednej metody . Ale dział wodny przełamuje lub zmniejsza segment cząsteczki, bez względu na to, z której metody korzystasz (chyba że ręcznie podasz znaczniki). Obecnie używam półautomatycznej metody segmentacji; tj. użyj działów wodnych, aby jak najlepiej posegmentować obraz, a następnie przenieś go do programu MSPaint i zmodyfikuj ręcznie, aby skorygować brak/niepełną segmentację.

Wydaje się, że w przeszłości niektórzy ludzie stosowali uprawy regionalne. Ale moja wiedza o przetwarzaniu obrazów jest ograniczona, więc nie mogę ci z tym pomóc. Byłoby wspaniale, gdyby ktokolwiek mógł opublikować coś o tym, jak wykorzystać rozwój regionalny do segmentowania takiego obrazu.

Mam nadzieję, że to pomoże.