Come posso generare uno scafo convesso di un'immagine binaria?

Aug 17 2020

Ho un'immagine binaria ( img) come mostrato di seguito e desidero generare uno scafo convesso della regione bianca.

Ho provato a utilizzare ConvexHullMeshma non sono riuscito a ottenere la dimensione desiderata con lo sfondo per adattarlo all'immagine originale.

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

Come posso generare lo scafo convesso desiderato (una maschera binaria circondata dallo sfondo)?

e ottengo

Risposte

3 flinty Aug 17 2020 at 19:20

A quanto pare puoi farlo subito con:

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

Vedi questa rispostahttps://mathematica.stackexchange.com/a/189196/72682


È un po' imbarazzante, ma puoi farli allineare usando Inset. Ho mostrato il limite di seguito, ma se vuoi la faccia, rimuovi semplicemente il RegionBoundary. Ho anche usato ImageValuePositionsun offset centrato sui pixel di 0,5, anziché 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}]

Per ottenere la maschera dell'immagine potresti fare:

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