Considérez une image (img
) comme
Je veux créer un masque binaire qui couvrir exactement le premier plan.
Si je fais ce qui suit
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
Jobtiens
Vous pouvez voir que la tête nest pas complètement blanche comme vous le souhaitez et cela peut être en raison du fait que le bas de la tête est relié à la limite de limage. Deuxièmement, près du cou (comme indiqué par la ligne verte), certains pixels sont noirs qui devraient être blancs.
Comment puis-je résoudre ces deux problèmes?
Commentaires
Réponse
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Un contour lissé (grâce à Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
Réponse
Cette approche utilise ImageData
travailler sur les lignes plutôt que sur limage entière. Après quelques manipulations, il détecte le premier et le dernier pixel blanc de chaque ligne et fait tourner le segment entier en 1
(cest-à-dire blanc).
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
Réponse
Avec GrowCutComponents[]
, on peut obtenir ceci:
Un peu de levage avec Dilatation / Erosion améliorera probablement le résultat.
Comment utiliser GrowCutComponents[]
?
vous devez créer les 2 masques et évaluer ce qui suit:
On peut créer les masques avec les outils de dessin voir ici
MorphologicalBinarize
au lieu deBinarize
et également jouer avec le deuxième argument.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
est un bon point de départ.