मैं एक बाइनरी छवि का उत्तल पतवार कैसे उत्पन्न कर सकता हूं?

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