1. 程式人生 > >如何正確地給影象新增高斯噪聲

如何正確地給影象新增高斯噪聲

高斯噪聲是一個均值為 0 方差為 σ n 2 \sigma_n^2 的正態分佈,是一個加性噪聲。但要正確地給圖片新增高斯噪聲,還要取決於程式中讀入圖片的資料格式。

如果圖片的資料格式為 uint8,也即資料的範圍為 [0, 255],那麼直接生成對應方差的噪聲,然後加到圖片上去。

# clean_image uint8 (128, 128)
noise_image = clean_image + np.random.rand(128, 128) * sigma

此處 np.random.rand(128, 128) 生成一個均值為 0 方差為 1 的正態分佈,然後我們乘以 σ n \sigma_n

,將方差調整到 σ n 2 \sigma_n^2 ,再加到圖片上即可。

如果圖片的資料格式為浮點型,而且資料的範圍為 [0, 1],那麼我們需要對噪聲的方差做一些調整,真正加到圖片上的噪聲方差應該為 σ

r e a l 2 = σ n 2 25 5 2 \sigma_{real}^2 = \frac{\sigma_n^2}{255^2} ,也即 σ r e a l = σ n 255 \sigma_{real} = \frac{\sigma_n}{255}

# clean_image float32 (128, 128)
noise_image = clean_image + np.random.rand(128, 128) * sigma / 255

此處 np.random.rand(128, 128) 生成一個均值為 0 方差為 1 的正態分佈,然後我們乘以 σ n / 255 \sigma_n / 255 ,將真實方差調整到 σ n 2 \sigma_n^2 ,再加到圖片上即可。

在 MATLAB 中,imnoise 會對圖片進行處理,將畫素值縮放到 [0, 1] 之間,因此我們在傳入方差的時候也必須要先進行調整。

noise_image = imnoise(clean_image, 'gaussian', 0, sigma^2/255^2)

有時候,我們真的需要對知識抱有敬畏之心,任何一個小的知識點都沒有那麼簡單。但如果你在這些小的知識點上犯了小錯誤,後果卻是不可想象的。千里之堤毀於蟻穴,與君共勉!

獲取更多精彩,請關注「seniusen」!