Comment puis-je générer une coque convexe d'une image binaire?

Aug 17 2020

J'ai une image binaire ( img) comme indiqué ci-dessous et je souhaite générer une coque convexe de la région blanche.

J'ai essayé d'utiliser ConvexHullMeshmais je n'ai pas pu obtenir la taille souhaitée avec l'arrière-plan pour s'adapter à l'image d'origine.

cv = ComponentMeasurements[
   FillingTransform[scleraRough1], {"ConvexVertices", "Mask"}];
cvScaled = Rescale@cv[[1, 2, 1]];
Rasterize@ConvexHullMesh[cvScaled]

Comment puis-je générer la coque convexe souhaitée (un masque binaire entouré par l'arrière-plan) ?

et je reçois

Réponses

3 flinty Aug 17 2020 at 19:20

Apparemment, vous pouvez le faire tout de suite avec :

Image@MorphologicalComponents[img, Method -> "ConvexHull"]

Voir cette réponsehttps://mathematica.stackexchange.com/a/189196/72682


C'est un peu gênant, mais vous pouvez les aligner en utilisant Inset. J'ai montré la limite ci-dessous, mais si vous voulez le visage, supprimez simplement le RegionBoundary. J'ai également utilisé ImageValuePositionsdes pixels centrés décalés de 0,5, plutôt que PixelValuePositions.

img = Import["https://i.stack.imgur.com/3ndPk.png"] // Binarize;
(* remove the border *)
img = ImageTake[img, {2, -2}, {2, -2}];
dims = ImageDimensions[img];
cvx = ConvexHullMesh[ImageValuePositions[img, 1]];
Graphics[{Inset[img, {0, 0}, {0, 0}, dims], Red, RegionBoundary[cvx]},
  PlotRangePadding -> None, PlotRange -> Transpose@{{0, 0}, dims}]

Pour obtenir le masque d'image, vous pouvez faire :

gr = Graphics[{Inset[img, {0, 0}, {0, 0}, dims], White, cvx}, 
   PlotRangePadding -> None, PlotRange -> Transpose@{{0, 0}, dims}];
Image[gr, ImageSize -> ImageDimensions[img]]