一、Python 图像加噪常用方式
1. 高斯噪声(Gaussian noise)
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。除常用抑制噪声的方法外,对高斯噪声的抑制方法常常采用数理统计方法。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。
高斯分布,也称正态分布,又称常态分布,记为N(μ,σ^2),其中μ,σ^2为分布的参数,分别为高斯分布的期望和方差。当有确定值时,p(x)也就确定了,特别当μ=0,σ^2=1时,X的分布为标准正态分布。
2. 椒盐噪声
椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。
3. 泊松噪声
泊松噪声,就是符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。如某一服务设施在一定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA序列的变异数、放射性原子核的衰变数等等。
4. 乘性噪声
乘性噪声一般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在他也就不在。
5. 瑞利噪声
瑞利噪声相比高斯噪声而言,其形状向右歪斜,这对于拟合某些歪斜直方图噪声很有用。
6. 伽马噪声
伽马噪声的分布,服从了伽马曲线的分布。伽马噪声的实现,需要使用b个服从指数分布的噪声叠加而来。指数分布的噪声,可以使用均匀分布来实现。(b=1时为指数噪声,b>1时通过若干个指数噪声叠加,得到伽马噪声)
7. 随机噪声/均匀噪声
二、Python实现
1. 随机噪声
# -*- coding: utf-8 -*-import cv2img = cv2.imread('test.jpg')# 噪声点数量coutn = 100000for k in range(0, coutn): # 获取图像噪声点的随机位置 xi = int(np.random.uniform(0, img.shape[1])) xj = int(np.random.uniform(0, img.shape[0])) # 加噪 if img.ndim == 2: # 灰度图像 img[xj, xi] = 255 elif img.ndim == 3: # 非灰度图像,图像加噪 img[xj, xi, 0] = 25 img[xj, xi, 1] = 20 img[xj, xi, 2] = 20cv2.imshow('img', img)cv2.waitKey()cv2.destroyAllWindows()
效果:
2. numpy 加高斯噪声
# -*- coding: utf-8 -*-import cv2import numpy as npdef add_gaussian_noise(image_in, noise_sigma): temp_image = np.float64(np.copy(image_in)) h = temp_image.shape[0] w = temp_image.shape[1] noise = np.random.randn(h, w) * noise_sigma noisy_image = np.zeros(temp_image.shape, np.float64) if len(temp_image.shape) == 2: noisy_image = temp_image + noise else: noisy_image[:, :, 0] = temp_image[:, :, 0] + noise noisy_image[:, :, 1] = temp_image[:, :, 1] + noise noisy_image[:, :, 2] = temp_image[:, :, 2] + noise """ print('min,max = ', np.min(noisy_image), np.max(noisy_image)) print('type = ', type(noisy_image[0][0][0])) """ return noisy_imageimg_path = 'test.jpg'img = cv2.imread(img_path)noise_sigma = 25noise_img = add_gaussian_noise(img, noise_sigma=noise_sigma)noise_path = 'noise_{}.jpg'.format(noise_sigma)cv2.imwrite(noise_path, noise_img)cv2.imshow('source', img)noise_img = cv2.imread(noise_path)cv2.imshow('noise', noise_img)cv2.waitKey()cv2.destroyAllWindows()
效果:
3. 椒盐噪声实现
# -*- coding: utf-8 -*-import cv2import randomfrom numpy import *def PepperandSalt(src, percetage): NoiseImg = src NoiseNum = int(percetage*src.shape[0]*src.shape[1]) for i in range(NoiseNum): randX=random.randint(0, src.shape[0]-1) randY=random.randint(0, src.shape[1]-1) if random.randint(0, 1) <= 0.5: NoiseImg[randX, randY] = 0 else: NoiseImg[randX, randY]=255 return NoiseImgimg = cv2.imread('test.jpg')img1 = PepperandSalt(img, 0.2)cv2.imwrite('test1.jpg', img1)cv2.imshow('PepperandSalt', img1)cv2.waitKey(0)
效果:
三、scikit-image 噪声函数
def random_noise(image, mode='gaussian', seed=None, clip=True, **kwargs):
功能:为浮点型图片添加各种随机噪声
参数:
image:输入图片(将会被转换成浮点型),ndarray型
mode: 可选择,str型,表示要添加的噪声类型
gaussian:高斯噪声localvar:高斯分布的加性噪声,在“图像”的每个点处具有指定的局部方差。poisson:泊松再生salt:盐噪声,随机将像素值变成1pepper:椒噪声,随机将像素值变成0或-1,取决于矩阵的值是否带符号s&p:椒盐噪声speckle:均匀噪声(均值mean方差variance),out=image+n*image
seed: 可选的,int型,如果选择的话,在生成噪声前会先设置随机种子以避免伪随机
clip: 可选的,bool型,如果是True,在添加均值,泊松以及高斯噪声后,会将图片的数据裁剪到合适范围内。如果谁False,则输出矩阵的值可能会超出[-1,1]
mean: 可选的,float型,高斯噪声和均值噪声中的mean参数,默认值=0
var: 可选的,float型,高斯噪声和均值噪声中的方差,默认值=0.01(注:不是标准差)
local_vars:可选的,ndarry型,用于定义每个像素点的局部方差,在localvar中使用
amount: 可选的,float型,是椒盐噪声所占比例,默认值=0.05
salt_vs_pepper:可选的,float型,椒盐噪声中椒盐比例,值越大表示盐噪声越多,默认值=0.5,即椒盐等量
--------返回值:ndarry型,且值在[0,1]或者[-1,1]之间,取决于是否是有符号数-------
测试代码
# -*- coding: utf-8 -*-import numpy as npimport matplotlib.pyplot as pltfrom PIL import Imagefrom skimage import utilimg = Image.open('test.jpg')img = np.array(img)noise_gs_img = util.random_noise(img, mode='gaussian')noise_salt_img = util.random_noise(img, mode='salt')noise_pepper_img = util.random_noise(img, mode='pepper')noise_sp_img = util.random_noise(img, mode='s&p')noise_speckle_img = util.random_noise(img, mode='speckle')plt.subplot(2, 3, 1), plt.title('original')plt.imshow(img)plt.subplot(2, 3, 2), plt.title('gaussian')plt.imshow(noise_gs_img)plt.subplot(2, 3, 3), plt.title('salt')plt.imshow(noise_salt_img)plt.subplot(2, 3, 4), plt.title('pepper')plt.imshow(noise_pepper_img)plt.subplot(2, 3, 5), plt.title('s&p')plt.imshow(noise_sp_img)plt.subplot(2, 3, 6), plt.title('speckle')plt.imshow(noise_speckle_img)plt.show()
运行效果: