簡體   English   中英

向圖像添加泊松噪聲

[英]Adding poisson noise to an image

我有一些圖像需要添加增量泊松噪聲,以便更徹底地分析它們。 我知道你可以在 MATLAB 中做到這一點,但你如何在 Python 中做到這一點? 到目前為止,搜索一無所獲。

海爾德的回答是正確的。 我只想補充一個事實,即泊松噪聲不是可加性的,您不能將其添加為高斯噪聲。

取決於您想要實現的目標,這里有一些建議:

  • 模擬低光噪聲圖像(如果 PEAK = 1,它會非常嘈雜)

     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
  • 在干凈的圖像上添加一個噪聲層

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

然后,您可以根據需要將結果裁剪為 0 - 255(我使用 PIL,因此我使用 255 而不是 1)。

其實保羅的回答沒有意義。

泊松噪聲取決於信號! 使用他提供的這些命令,后來添加到圖像中的噪聲與信號無關。

為了使其依賴於信號,您應該將圖像傳遞給 NumPy 的泊松函數:

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

noise_mask = numpy.random.poisson(img)

noisy_img = img + noise_mask

您可以使用skimage.util.random_noise

from skimage.util import random_noise

noisy = random_noise(img, mode="poisson")

來自本書第 1 章的第1.4.4- “泊松分布的高斯近似”

對於較大的平均值,泊松分布可以很好地近似為高斯分布,其均值和方差等於泊松隨機變量的均值:

P(μ) ≈ N (μ,μ)

然后,我們可以從正態分布 N (0,1) 生成泊松噪聲,通過 μ 的平方根縮放其標准偏差並將其添加到圖像中,即 μ 值:

# Image size
M, N = 1000, 1000

# Generate synthetic image
image = np.tile(np.arange(0,N,dtype='float64'),(M,1)) * 20

# -- sqrt(mu) * normal(0,1) --
poisson_noise = np.sqrt(image) * np.random.normal(0, 1, image.shape)

# Add the noise to the mu values
noisy_image = image + poisson_noise

plt.figure(figsize=(10,10))
plt.subplot(2,2,1)
plt.title('Image')
plt.imshow(image,'gray')
plt.subplot(2,2,2)
plt.title('Noisy image noise')
plt.imshow(noisy_image,'gray')  
plt.subplot(2,2,3)
plt.title('Image profile')
plt.plot(image[0,:])
plt.subplot(2,2,4)
plt.title('Noisy image profile')
plt.plot(noisy_image[0,:])

print("Synthetic image mean: {}".format(image[:,1].mean()))
print("Synthetic image variance: {}".format(image[:,1].var()))    
print("Noisy image mean: {}".format(noisy_image[:,1].mean()))
print("Noisy image variance: {}".format(noisy_image[:,1].var()))

由於泊松噪聲是信號相關的,當我們增加基礎信號時,噪聲方差也會增加,正如我們在此行配置文件中所見:

形象

單列中的統計輸出:

合成圖像平均值:20.0

合成圖像方差:0.0

噪聲圖像的意思是:19.931120555821597

噪聲圖像方差:19.39456713877459

進一步參考:[ 1 ][ 2 ]

如果您可以使用 numpy/scipy,那么以下內容應該會有所幫助。 我建議您將數組轉換為浮動以進行中間計算,然后轉換回 uint8 以用於輸出/顯示目的。 由於泊松噪聲全部 >=0,您需要決定如何在轉換回 uint8 時處理數組溢出。 您可以根據您的目標進行縮放或截斷。

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

poissonNoise = numpy.random.poisson(imagea).astype(float)

noisyImage = imagea + poissonNoise

#here care must be taken to re cast the result to uint8 if needed or scale to 0-1 etc...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM