高斯噪聲是一個均值為 0 方差為 \(\sigma_n^2\) 的正態分布,是一個加性噪聲。但要正確地給圖片添加高斯噪聲,還要取決於程序中讀入圖片的數據格式。
如果圖片的數據格式為 uint8,也即數據的范圍為 [0, 255],那么直接生成對應方差的噪聲,然后加到圖片上去。
# clean_image uint8 (128, 128)
noise_image = clean_image + np.random.randn(128, 128) * sigma
此處 np.random.rand(128, 128) 生成一個均值為 0 方差為 1 的正態分布,然后我們乘以 \(\sigma_n\),將方差調整到 \(\sigma_n^2\),再加到圖片上即可。
如果圖片的數據格式為浮點型,而且數據的范圍為 [0, 1],那么我們需要對噪聲的方差做一些調整,真正加到圖片上的噪聲方差應該為 \(\sigma_{real}^2 = \frac{\sigma_n^2}{255^2}\),也即 \(\sigma_{real} = \frac{\sigma_n}{255}\)。
# clean_image float32 (128, 128)
noise_image = clean_image + np.random.randn(128, 128) * sigma / 255
此處 np.random.rand(128, 128) 生成一個均值為 0 方差為 1 的正態分布,然后我們乘以 \(\sigma_n / 255\),將真實方差調整到 \(\sigma_n^2\),再加到圖片上即可。
在 MATLAB 中,imnoise 會對圖片進行處理,將像素值縮放到 [0, 1] 之間,因此我們在傳入方差的時候也必須要先進行調整。
noise_image = imnoise(clean_image, 'gaussian', 0, sigma^2/255^2)
有時候,我們真的需要對知識抱有敬畏之心,任何一個小的知識點都沒有那么簡單。但如果你在這些小的知識點上犯了小錯誤,后果卻是不可想象的。千里之堤毀於蟻穴,與君共勉!
獲取更多精彩,請關注「seniusen」!

