9
$\begingroup$

Is it possible to identify a color (say grey in a 3 color Black, Gray and White image) and replace the color with HatchFilling?

I've tried to convert an image using ImageGraphics and then combine the result together inside of a Graphics with Hatchfill but I have had no luck. Is the result of ImageGraphics considered a Graphics expression?

labels = ClusteringComponents[img]
Image[Replace[labels, 
   ComponentMeasurements[{img, labels}, "MeanIntensity"], 2]];
MedianFilter[%, 1];
candidate1 = 
 CurvatureFlowFilter[MeanShiftFilter[%, 8, 1/16], 2]


(* Also have tried *)
ColorQuantize[img, 4, Dithering -> False];
ImageApply[Max, ColorSeparate[%]] // ImageAdjust;
smooth = CurvatureFlowFilter[MeanShiftFilter[%, 8, 1/14], 2];
MedianFilter[%, 1];
Blur[%, 2]

These are the current settings I am using to transform a picture into a smoothed out greyscaled image but trying Image

ImageGraphics[#, 3, Method -> {"LinearSeparable", 70 \[Degree]}, 
   MinColorDistance -> .1, ImageSize -> 600] &@%

and then

graphics[{%,Hatchfilling}]

Does nothing. I know I need to throw in a colordetect for the color but I do not think that is the issue.

$\endgroup$
1
  • 1
    $\begingroup$ Most likely the answer is yes. Add some code to your question and there's a better chance for an answer that's useful to you. $\endgroup$ – bobthechemist Jan 23 at 19:00
10
$\begingroup$

Using an input example from the documentation page for ImageGraphics:

hilbert = Import["https://i.stack.imgur.com/F9aZB.png"]

enter image description here

smoothHilbert = CurvatureFlowFilter[MeanShiftFilter[hilbert, 8, 1/16], 2];

ig = ImageGraphics[smoothHilbert, 3]

enter image description here

colors = Cases[ig, {a_, _FilledCurve} :> a, All]

enter image description here

ig /. colors[[1]] -> HatchFilling[]

enter image description here

ig /. {colors[[1]] -> HatchFilling[], 
  colors[[2]] -> PatternFilling["Checkerboard", {10, 10}], 
  colors[[3]] -> HatchFilling[-45 Degree, 5, 10]} 

enter image description here

$\endgroup$
4
  • $\begingroup$ awesome thank you so much for the help! $\endgroup$ – skyfire Jan 23 at 19:35
  • $\begingroup$ @skyfire, my pleasure. Thank you for the accept. $\endgroup$ – kglr Jan 23 at 19:37
  • 1
    $\begingroup$ colors =Union[ Cases[ig, _?ColorQ, {1, -1}]] works fine too. $\endgroup$ – andre314 Jan 23 at 19:39
  • $\begingroup$ @andre314, thank you. It is much cleaner and seems more general. $\endgroup$ – kglr Jan 23 at 19:48
4
$\begingroup$

Here's a way to do it without converting the image into vectorized graphics.

hilbert = Import["https://i.stack.imgur.com/F9aZB.png"];
smoothHilbert = CurvatureFlowFilter[MeanShiftFilter[hilbert, 12, 1/16], 2];
quantizedHilbert = ColorQuantize[smoothHilbert, {Black, White, Gray}, Dithering -> False];

Mathematica graphics

whiteMask = ColorReplace[quantizedHilbert, Gray -> Black]

Mathematica graphics

{width, height} = ImageDimensions[whiteMask];
filling = Rasterize@Graphics[{
     HatchFilling[],
     Rectangle[{0, 0}, {width, height}]
     }, ImageSize -> {width, height}, PlotRangePadding -> None];

filling whiteMask + ColorNegate[whiteMask] quantizedHilbert

Mathematica graphics

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.