Hvordan lage en binær maske av et bilde

Vurder et bilde (img) som

skriv inn bildebeskrivelse her

Jeg vil lage en binær maske som vil dekk forgrunnen nøyaktig.

Hvis jeg gjør følgende

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

får jeg

skriv inn bildebeskrivelse her

Du kan se at hodet ikke er helt hvitt som ønsket, og dette kan være på grunn av at bunnen av hodet er koblet til grensen for bildet. For det andre, i nærheten av nakken (som indikert av den grønne linjen), er noen piksler svarte som skal være hvite.

skriv inn bildebeskrivelse her

Hvordan kan jeg fikse disse to problemene?

Kommentarer

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

Svar

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

bilde

En glatt disposisjon (takket være Rahul ):

Binarize@CurvatureFlowFilter[img2, 3] 

bilde

Svar

Denne tilnærmingen bruker ImageData å jobbe på linjene, i stedet for hele bildet. Etter noen få manipulasjoner oppdager den den første og siste hvite piksel på hver linje og snur hele segmentet til 1 (dvs. hvit).

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 

skriv inn bildebeskrivelse her

Svar

Med GrowCutComponents[] kan man få dette:

skriv inn bildebeskrivelse her

Litt løfting med utvidelse / erosjon vil sannsynligvis forbedre resultatet.

Hvordan bruker du GrowCutComponents[]?

du må lage de to maskene og evaluere følgende:

skriv inn bildebeskrivelse her

Man kan lage masker med tegneverktøy se her

Svar

Her er en annen løsning motivert av Alexey.

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

The resultatet er:

skriv inn bildebeskrivelse her

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *