¿Cómo puedo generar un casco convexo de una imagen binaria?

Aug 17 2020

Tengo una imagen binaria ( img) como se muestra a continuación y deseo generar un casco convexo de la región blanca.

Traté de usar ConvexHullMeshpero no pude obtener el tamaño deseado con el fondo para encajar en la imagen original.

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

¿Cómo puedo generar el casco convexo deseado (una máscara binaria rodeada por el fondo)?

y obtengo

Respuestas

3 flinty Aug 17 2020 at 19:20

Aparentemente puedes hacer esto de inmediato con:

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

ver esta respuestahttps://mathematica.stackexchange.com/a/189196/72682


Es un poco incómodo, pero puedes hacer que se alineen usando Inset. He mostrado el límite a continuación, pero si desea la cara, simplemente elimine el RegionBoundary. También usé ImageValuePositionsque están centrados en píxeles compensados ​​​​por 0.5, en lugar de 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}]

Para obtener la máscara de imagen que podría hacer:

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