Overvej et billede (img
) som
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
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.
Hvordan kan jeg løse disse to problemer?
Kommentarer
Svar
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
En udjævnet omrids (takket være Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
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
Svar
Med GrowCutComponents[]
kan man få dette:
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:
Man kan oprette maskerne med tegneværktøjer se her
MorphologicalBinarize
i stedet forBinarize
og også spille med det andet argument.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
er et godt udgangspunkt.