文章目錄
- 前言
- 一、高斯噪聲
- 二、椒鹽噪聲
- 三、泊松噪聲
- 四、斑點噪聲
- 五、指數噪聲
- 六、均勻噪聲
- 總結
前言
本文主要介紹幾種添加圖像噪聲的方法,用于數據增強等操作。
以下圖為例。
一、高斯噪聲
高斯噪聲就是給圖片添加一個服從高斯分布的噪聲,可以通過調節高斯分布標準差(sigma)的大小來控制添加噪聲程度,sigma越大添加的噪聲越多圖片損壞的越厲害。(高斯噪聲更像是早期熒幕上的各種小點)
def gaussian_noise(image):h, w, c = image.shapemean = 0sigma = 25 # 標準差noise = np.random.normal(mean, sigma, (h, w, c)) #根據均值和標準差生成符合高斯分布的噪聲noisy_image = np.clip(image + noise, 0, 255).astype(np.uint8)return noisy_image
二、椒鹽噪聲
椒鹽噪聲就是給圖片添加黑白噪點,椒指的是黑色的噪點(0,0,0)鹽指的是白色的噪點(255,255,255),通過設置amount來控制添加噪聲的比例,值越大添加的噪聲越多,圖像損壞的更加嚴重
def jiaoyan_noise(image):#設置添加椒鹽噪聲的數目比例s_vs_p = 0.5#設置添加噪聲圖像像素的數目amount = 0.04noisy_img = np.copy(image)#添加salt噪聲num_salt = np.ceil(amount * image.size * s_vs_p)#設置添加噪聲的坐標位置coords = [np.random.randint(0,i - 1, int(num_salt)) for i in image.shape]noisy_img[coords[0],coords[1],:] = [255,255,255]#添加pepper噪聲num_pepper = np.ceil(amount * image.size * (1. - s_vs_p))#設置添加噪聲的坐標位置coords = [np.random.randint(0,i - 1, int(num_pepper)) for i in image.shape]noisy_img[coords[0],coords[1],:] = [0,0,0]#保存圖片return noisy_img
三、泊松噪聲
圖像中的泊松噪聲是由于在成像過程中光子的隨機性引起的。當光子以不規則的速率到達傳感器時,就會在圖像中引入泊松噪聲。泊松噪聲在圖像中表現為亮度值的隨機變化,尤其在低亮度區域更為顯著。這種噪聲使得圖像中的細節模糊,并且可能干擾圖像處理算法和分析。
def generate_poisson_noise(img, scale=1.0, gray_noise=False):if gray_noise:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# round and clip image for counting vals correctlyimg = np.clip((img * 255.0).round(), 0, 255) / 255.vals = len(np.unique(img))vals = 2**np.ceil(np.log2(vals))out = np.float32(np.random.poisson(img * vals) / float(vals))noise = out - imgif gray_noise:noise = np.repeat(noise[:, :, np.newaxis], 3, axis=2)return noise * scaledef random_generate_poisson_noise(img, scale_range=(0, 1.0), gray_prob=0):scale = np.random.uniform(scale_range[0], scale_range[1])if np.random.uniform() < gray_prob:gray_noise = Trueelse:gray_noise = Falsereturn generate_poisson_noise(img, scale, gray_noise)def random_add_poisson_noise(img, scale_range=(0, 1.0), gray_prob=0):noise = random_generate_poisson_noise(img, scale_range, gray_prob)out = img + noisereturn out
四、斑點噪聲
斑點噪聲是數字圖像中常見的一種噪聲類型,通常表現為圖像中出現隨機像素點。這種噪聲可能是由于圖像傳感器故障、信號傳輸錯誤或圖像存儲過程中的錯誤引起的。
def bandian_noise(image):h,w,c = image.shapegauss = np.random.randn(h,w,c)#給圖片添加speckle噪聲noisy_img = image + image * gauss#歸一化圖像的像素值noisy_img = np.clip(noisy_img,a_min=0,a_max=255)return noisy_img
五、指數噪聲
在圖像處理中,指數噪聲可能是由于光照條件不穩定、傳感器故障或信號傳輸錯誤等原因引起的
def zhishu_noise(img):a = 10.0noiseExponent = np.random.exponential(scale=a, size=img.shape)imgExponentNoise = img + noiseExponentnoisy_img = np.uint8(cv2.normalize(imgExponentNoise, None, 0, 255, cv2.NORM_MINMAX)) # 歸一化為 [0,255]return noisy_img
六、均勻噪聲
類似于指數噪聲,只不過采樣方式不同
def uniform_noise(img):mean, sigma = 10, 100a = 2 * mean - np.sqrt(12 * sigma) # a = -14.64b = 2 * mean + np.sqrt(12 * sigma) # b = 54.64noiseUniform = np.random.uniform(a, b, img.shape)imgUniformNoise = img + noiseUniformnoisy_img = np.uint8(cv2.normalize(imgUniformNoise, None, 0, 255, cv2.NORM_MINMAX)) # 歸一化為 [0,255]return noisy_img
總結
目前主流的噪聲添加就這么幾種,最常用的是高斯和泊松,在數據增強中還是有很大幫助的。