Bagaimana cara membuat cembung lambung dari gambar biner?

Aug 17 2020

Saya memiliki gambar biner ( img) seperti yang ditunjukkan di bawah ini dan saya ingin menghasilkan lambung cembung di wilayah putih.

Saya mencoba menggunakan ConvexHullMeshtetapi tidak bisa mendapatkan ukuran yang diinginkan dengan latar belakang yang sesuai dengan gambar aslinya.

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

Bagaimana saya bisa menghasilkan cembung yang diinginkan (topeng biner yang dikelilingi oleh latar belakang)?

dan saya mendapatkan

Jawaban

3 flinty Aug 17 2020 at 19:20

Tampaknya Anda bisa langsung melakukannya dengan:

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

Lihat jawaban ini https://mathematica.stackexchange.com/a/189196/72682


Agak canggung, tetapi Anda bisa membuat mereka berbaris menggunakan Inset. Saya telah menunjukkan batas di bawah ini, tetapi jika Anda menginginkan wajah, hapus saja RegionBoundary. Saya juga menggunakan ImageValuePositionspiksel yang centered offset 0,5, bukan 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}]

Untuk mendapatkan image mask Anda bisa melakukan:

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