Rozważ obraz (img
) jako
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
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.
Jak mogę naprawić te dwa problemy?
Komentarze
Odpowiedź
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Wygładzony kontur (dzięki Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
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
Odpowiedź
Za pomocą GrowCutComponents[]
można uzyskać to:
Trochę liftingu z rozszerzaniem / erozją prawdopodobnie poprawi wynik.
Jak korzystać z GrowCutComponents[]
?
Musisz utworzyć 2 maski i ocenić następujące elementy:
Maski można tworzyć za pomocą narzędzi do rysowania patrz tutaj
MorphologicalBinarize
zamiastBinarize
, a także pobawić się drugim argumentem.