Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding poisson noise to an image

I have some images that I need to add incremental amounts of Poisson noise to in order to more thoroughly analyze them. I know you can do this in MATLAB, but how do you go about doing it in Python? Searches have yielded nothing so far.

like image 900
vdogsandman Avatar asked Oct 10 '13 07:10

vdogsandman


People also ask

How do I add sound to a Poisson image?

J = imnoise( I ,'poisson') generates Poisson noise from the data instead of adding artificial noise to the data. See Algorithms for more information. J = imnoise( I ,'salt & pepper') adds salt and pepper noise, with default noise density 0.05. This affects approximately 5% of pixels.

What is Poisson noise in images?

Photon noise, also known as Poisson noise, is a basic form of uncertainty associated with the measurement of light, inherent to the quantized nature of light and the independence of photon detections.


2 Answers

Actually the answer of Paul doesnt make sense.

Poisson noise is signal dependent! And using those commands, provided by him, the noise later added to the image is not signal dependent.

To make it signal dependent you shold pass the image to the NumPy's poisson function:

filename = 'myimage.png'
img = (scipy.misc.imread(filename)).astype(float)

noise_mask = numpy.random.poisson(img)

noisy_img = img + noise_mask
like image 146
Helder Avatar answered Sep 26 '22 01:09

Helder


The answer of Helder is correct. I just want to add the fact that Poisson noise is not additive and you can not add it as Gaussian noise.

Depend on what you want to achieve, here is some suggestions:

  • Simulate a low-light noisy image (if PEAK = 1, it will be really noisy)

    import numpy as np
    image = read_image("YOUR_IMAGE")  # need a rescale to be more realistic
    noisy = np.random.poisson(image / 255.0 * PEAK) / PEAK * 255  # noisy image
    
  • Add a noise layer on top of the clean image

    import numpy as np
    image = read_image("YOUR_IMAGE") 
    noisemap = create_noisemap() 
    noisy = image + np.random.poisson(noisemap)  
    

Then you can crop the result to 0 - 255 if you like (I use PIL so I use 255 instead of 1).

like image 29
yuxiang.li Avatar answered Sep 25 '22 01:09

yuxiang.li