Beschouw een afbeelding (img
) als
Ik wil een binair masker maken dat bedek precies de voorgrond.
Als ik het volgende doe
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
krijg ik
Je kunt zien dat de kop niet helemaal wit is zoals gewenst en dit kan vanwege het feit dat de onderkant van het hoofd is verbonden met de grens van het beeld. Ten tweede zijn bij de hals (zoals aangegeven door de groene lijn) sommige pixels zwart, wat wit zou moeten zijn.
Hoe kan ik deze twee problemen oplossen?
Opmerkingen
Antwoord
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Een afgevlakte omtrek (met dank aan Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
Antwoord
Deze benadering maakt gebruik van ImageData
werken aan de lijnen, in plaats van aan het hele beeld. Na een paar manipulaties detecteert het de eerste en laatste witte pixel op elke regel en verandert het hele segment in 1
(dwz wit).
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
Antwoord
Met GrowCutComponents[]
kan men dit verkrijgen:
Een beetje tillen met dilatatie / erosie zal waarschijnlijk het resultaat verbeteren.
Hoe GrowCutComponents[]
te gebruiken?
je moet de 2 maskers maken en het volgende evalueren:
Men kan de maskers maken met tekengereedschappen zie hier
MorphologicalBinarize
proberen in plaats vanBinarize
en ook spelen met het tweede argument.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
is een goed startpunt.