分別用MATLAB和Python向數字圖像添加指定噪聲濃度的高斯噪聲

       最近在做圖像處理工作,需要向原圖像添加高斯噪聲,來模擬現實生活中的實際噪聲。發現MATLAB和Python中都有相應的API可以用,但是實際使用中會有些“坑”需要注意。特此記錄下來,與各位分享。

一.使用MATLAB向圖像中添加均值爲0,標準差σ=15的高斯噪聲

Matlab上有官方給出的API

J = imnoise(I,’gaussian’,M,V) adds Gaussian white noise of mean m and variance v to the image I. The default is zero mean noise with 0.01 variance. 
I:原圖     M:均值   V:方差

這裏要注意的是,imnoise()函數,會將原始圖片像素的取值範圍轉換到[0,1]範圍內,然後纔開始添加高斯噪聲,最後還會將圖像轉換爲[0,255]。所以如果你一開始輸入的圖片取值範圍是[0,255],那麼就需要將均值和方差必須也要歸一化到[0,1]範圍內。具體的MATLAB 實現如下,對應的PSNR爲24.94

image_o=imread('C:\Users\ASUS\Desktop\JSRT_test\JPCLN147.jpg');
image_o=rgb2gray(image_o); %轉爲灰度圖
x1=imnoise(image_o,'gaussian',0,(15/255)^2);%添加標準差爲15的高斯噪聲
imwrite(x1,'C:\Users\ASUS\Desktop\gaussian_15.jpg');%保存圖像至桌面
psnr(image_o,x1) %PSNR=24.9461

二. 使用Python向圖像中添加均值爲0,標準差σ=15的高斯噪聲

我們一般可以使用,skimage.util.random_noise(imagemode=’gaussian’seed=Noneclip=True**kwargs)

image:輸入圖片,要求是array類型

mode:有很多種模式可選  這裏是添加高斯噪聲

seed:是隨機種子,如果給定具體的數字,就可以產生僞隨機,給定None就是真的隨機參數

clip:對圖像添加高斯噪聲後,圖像原始的像素值可能會小於0,也有可能大於255,clip設置爲True將會將這些值統一設置爲0或者255;clip設置成False,就會有可能出現一些超過區間的點

mean:均值,默認爲0

var:噪聲的方差,注意設置

 

與MATLAB一樣,該函數也是需要將圖片的取值範圍轉化成[0,1],所以設置方差的時候要注意參數的設置;不同的是,最終返回的數據的取值範圍還是[0,1],不會變成[0,255],所以,你要是想保存加噪後的圖片,或者要和原圖進行PSNR的計算,就需要將圖片的範圍重新調至[0,255]

具體的Python的實現代碼如下

import cv2
import numpy as np
import skimage

def  psnr (img_1,img_2):
    mse=((np.asarray(img_1) - np.asarray(img_2).astype(np.float)) ** 2).mean()
    psnr=10* np.log10((255**2)/mse)
    return psnr

img1=cv2.imread("C:/Users/ASUS/Desktop/JSRT_test/JPCLN147.jpg",0)
img_noise=skimage.util.random_noise(img1, mode='gaussian', seed=None, var=(15/255.0)**2) #add  gaussian noise
img_noise=img_noise*255  #limit the value in the range (0,255)
Psnr=psnr(img1,img_noise)
print("PSNR:",Psnr)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章