Comment créer un masque binaire dune image

Considérez une image (img) comme

entrez la description de limage ici

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

entrez la description de limage ici

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.

entrez la description de limage ici

Comment puis-je résoudre ces deux problèmes?

Commentaires

  • Vous pouvez essayer MorphologicalBinarize au lieu de Binarize et également jouer avec le deuxième argument.
  • MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False] est un bon point de départ.

Réponse

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

image

Un contour lissé (grâce à Rahul ):

Binarize@CurvatureFlowFilter[img2, 3] 

image

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 

entrez la description de limage ici

Réponse

Avec GrowCutComponents[], on peut obtenir ceci:

entrez la description de limage ici

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:

entrez la description de limage ici

On peut créer les masques avec les outils de dessin voir ici

Réponse

Voici une autre solution motivée par Alexey.

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

Le le résultat est:

entrez la description de limage ici

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *