Vurder et bilde (img
) som
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
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.
Hvordan kan jeg fikse disse to problemene?
Kommentarer
Svar
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
En glatt disposisjon (takket være Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
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
Svar
Med GrowCutComponents[]
kan man få dette:
Litt løfting med utvidelse / erosjon vil sannsynligvis forbedre resultatet.
Hvordan bruker du GrowCutComponents[]
?
du må lage de to maskene og evaluere følgende:
Man kan lage masker med tegneverktøy se her
MorphologicalBinarize
i stedet forBinarize
og også spille med det andre argumentet.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
er et godt utgangspunkt.