Jak utworzyć binarną maskę obrazu

Rozważ obraz (img) jako

tutaj wprowadź opis obrazu

Chcę utworzyć maskę binarną, dokładnie zakryj pierwszy plan.

Jeśli wykonam następujące czynności

b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned] 

Otrzymam

tutaj wprowadź opis obrazu

Możesz zobaczyć, że głowa nie jest całkowicie biała zgodnie z życzeniem i może to być ze względu na to, że dół głowy jest połączony z granicą obrazu. Po drugie, w pobliżu szyi (jak wskazuje zielona linia) niektóre piksele są czarne, a powinny być białe.

wprowadź opis obrazu tutaj

Jak mogę naprawić te dwa problemy?

Komentarze

  • Możesz spróbować MorphologicalBinarize zamiast Binarize, a także pobawić się drugim argumentem.
  • to dobry punkt wyjścia.

Odpowiedź

img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10] 

obraz

Wygładzony kontur (dzięki Rahul ):

Binarize@CurvatureFlowFilter[img2, 3] 

obraz

Odpowiedź

W tym podejściu zastosowano ImageData pracować nad liniami, a nie całym obrazem. Po kilku manipulacjach wykrywa pierwszy i ostatni biały piksel w każdej linii i zmienia cały segment na 1 (tj. Biały).

img = Import["https://i.stack.imgur.com/Mw1iJ.png"] edges = EdgeDetect[img, 2] data = ImageData@edges; Table[line = data[[j]]; pos = Flatten@Position[line, 1]; If[Length[pos] > 1, data[[j, pos[[1]] ;; pos[[-1]]]] = 1]; , {j, Length@data}]; Image@data 

tutaj wprowadź opis obrazu

Odpowiedź

Za pomocą GrowCutComponents[] można uzyskać to:

tutaj wprowadź opis obrazu

Trochę liftingu z rozszerzaniem / erozją prawdopodobnie poprawi wynik.

Jak korzystać z GrowCutComponents[]?

Musisz utworzyć 2 maski i ocenić następujące elementy:

tutaj wprowadź opis obrazu

Maski można tworzyć za pomocą narzędzi do rysowania patrz tutaj

Odpowiedź

Oto kolejne rozwiązanie, na które motywował Alexey.

Opening[DeleteSmallComponents[ ColorNegate[ RegionBinarize[img, {{1, 1}}, 0.1, Method -> "MeanEuclidean"]], CornerNeighbors -> False], 1] 

wynik to:

tutaj wprowadź opis obrazu

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *