Как создать выпуклую оболочку двоичного изображения?

Aug 17 2020

У меня есть двоичное изображение ( img), как показано ниже, и я хочу создать выпуклую оболочку белой области.

Я попытался использовать, ConvexHullMeshно не смог получить желаемый размер с фоном, который соответствовал исходному изображению.

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

Как я могу создать желаемую выпуклую оболочку (двоичную маску, окруженную фоном)?

и я получаю

Ответы

3 flinty Aug 17 2020 at 19:20

По-видимому, вы можете сделать это сразу с помощью:

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

Смотрите этот ответ https://mathematica.stackexchange.com/a/189196/72682


Это немного неудобно, но вы можете заставить их выстроиться в очередь, используя Inset. Я показал границу ниже, но если вам нужно лицо, просто удалите RegionBoundary. Я также использовал ImageValuePositionsсмещение по центру пикселя на 0,5, а не 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}]

Чтобы получить маску изображения, вы можете сделать:

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