バイナリイメージの凸包を生成するにはどうすればよいですか?

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、ピクセル中心のオフセットがPixelValuePositions。ではなく0.5であるものも使用しました。

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]]