Sådan oprettes en binær maske af et billede

Overvej et billede (img) som

indtast billedebeskrivelse her

Jeg vil oprette en binær maske, som dæk nøjagtigt forgrunden.

Hvis jeg gør følgende

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

får jeg

indtast billedbeskrivelse her

Du kan se, at hovedet ikke er helt hvidt som ønsket, og dette kan være på grund af det faktum, at bunden af hovedet er forbundet med billedets grænse. For det andet nær halsen (som angivet med den grønne linje) er nogle pixels sorte, som skal være hvide.

indtast billedbeskrivelse her

Hvordan kan jeg løse disse to problemer?

Kommentarer

  • Du kan prøve MorphologicalBinarize i stedet for Binarize og også spille med det andet argument.
  • MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False] er et godt udgangspunkt.

Svar

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

billede

En udjævnet omrids (takket være Rahul ):

Binarize@CurvatureFlowFilter[img2, 3] 

billede

Svar

Denne fremgangsmåde bruger ImageData at arbejde på linjerne snarere end hele billedet. Efter et par manipulationer registrerer den den første og sidste hvide pixel på hver linje og drejer hele segmentet til 1 (dvs. hvid).

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 

indtast billedebeskrivelse her

Svar

Med GrowCutComponents[] kan man få dette:

indtast billedebeskrivelse her

En lille smule løft med udvidelse / erosion vil sandsynligvis forbedre resultatet.

Hvordan bruges GrowCutComponents[]?

du skal oprette de 2 masker og evaluere følgende:

indtast billedbeskrivelse her

Man kan oprette maskerne med tegneværktøjer se her

Svar

Her er en anden løsning motiveret af Alexey.

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

resultatet er:

indtast billedbeskrivelse her

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *