2

I am a Mathematica newbie. I need to sample random points from an image which I have stored in a variable img as:

image=Import["ExampleData/ocelot.jpg"]    
img = ImageData[image]

Can you guys suggest how I can use a BernoulliDistribution to sample points from the image using Flatten, Map, RandomVariate, Partition and Image functions?

I know a similar problem was discussed here but the solutions there are very convoluted and I am not able to follow them. Thanks a lot for the help and very sorry if this seems like a duplicate post but I have spent the whole evening banging my head over the link to the post above but am not able to reproduce the same with the above functions. Thanks again!

J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574

1 Answers1

2

I'm assuming you want to vary the Bernoulli parameter p depending on the pixel grayscale value. Darker areas of the image are more likely to generate a black pixel and lighter areas more likely to be white.

img = Import["ExampleData/ocelot.jpg"];
dat = ImageData[img];
result = Image[
  Map[RandomVariate[BernoulliDistribution[#]] &, dat, {2}]]

random stippling effect

The positions where a 1 appears are given by:

PixelValuePositions[result, 1]

The sum of many images averaged over time converges to the grayscale image in the limit.

img = Import["ExampleData/ocelot.jpg"];
dat = ImageData[img];
ListAnimate[
 ImageAdjust[Image[#]] & /@ 
  Accumulate[
   ParallelTable[
    Map[RandomVariate[BernoulliDistribution[#]] &, dat, {2}], {30}]]
 ]

enter image description here

flinty
  • 25,147
  • 2
  • 20
  • 86