目录
1、随机噪声
2、椒盐噪声
3、高斯噪声
补充:numpy.clip函数
4、其他噪声
随机噪声就是通过随机函数在图像上随机地添加噪声点
随机函数random模块参考:https://blog.csdn.net/qq_45769063/article/details/107136319
def random_noise(image,noise_num):
'''
添加随机噪点(实际上就是随机在图像上将像素点的灰度值变为255即白色)
:param image: 需要加噪的图片
:param noise_num: 添加的噪音点数目,一般是上千级别的
:return: img_noise
'''
#
# 参数image:,noise_num:
img = cv2.imread(image)
img_noise = img
# cv2.imshow("src", img)
rows, cols, chn = img_noise.shape
# 加噪声
for i in range(noise_num):
x = np.random.randint(0, rows)#随机生成指定范围的整数
y = np.random.randint(0, cols)
img_noise[x, y, :] = 255
return img_noise
img_noise = random_noise("colorful_lena.jpg",3000)
cv2.imshow('random_noise',img_noise)
cv2.waitKey(0)
椒盐噪声(salt-and-pepper noise)是指两种噪声,一种是盐噪声(salt noise),另一种是胡椒噪声(pepper noise)。盐=白色(0),椒=黑色(255)。前者是高灰度噪声,后者属于低灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点
以下使用的是一个阈值(prob、thres)进行的噪声分布,也可以用其他方法进行
def sp_noise(image,prob):
'''
添加椒盐噪声
image:原始图片
prob:噪声比例
'''
image = cv2.imread(image)
output = np.zeros(image.shape,np.uint8)
noise_out = np.zeros(image.shape,np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()#随机生成0-1之间的数字
if rdn < prob:#如果生成的随机数小于噪声比例则将该像素点添加黑点,即椒噪声
output[i][j] = 0
noise_out[i][j] = 0
elif rdn > thres:#如果生成的随机数大于(1-噪声比例)则将该像素点添加白点,即盐噪声
output[i][j] = 255
noise_out[i][j] = 255
else:
output[i][j] = image[i][j]#其他情况像素点不变
noise_out[i][j] = 100
result = [noise_out,output]#返回椒盐噪声和加噪图像
return result
sp_noise,img_noise = sp_noise("colorful_lena.jpg",0.1)
cv2.imshow('sp_noise',sp_noise)
cv2.imshow('sp_noise_img',img_noise)
cv2.waitKey(0)
高斯噪声(Gaussian noise)是指它的概率密度函数服从高斯分布的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。
注意:“高斯白噪声的幅度服从高斯分布”的说法是错误的,高斯噪声的幅度服从瑞利分布。即使是一维的高斯白噪声,其幅度也不会服从高斯分布,而应该服从瑞利分布。二维不相关的复高斯白噪声包络服从指数分布(x2分布的自由度为2的特例)。n个不相关的复高斯白噪声序列叠加后的复信号包络服从自由度为2n的x2分 布。
必须区分高斯噪声和白噪声两个不同的概念。高斯噪声是指噪声的概率密度函数服从高斯分布,白噪声是指噪声的任意两个采样样本之间不相关,两者描述的角度不同。白噪声不必服从高斯分布,高斯分布的噪声不一定是白噪声。当然,实际系统中的热噪声是我们一般所说的白噪声的主要来源,它是服从高斯分布的,但一般具有有限的带宽,即常说的窄带白噪声,严格意义上它不是白噪声。
def gasuss_noise(image, mean=0, var=0.001):
'''
添加高斯噪声
image:原始图像
mean : 均值
var : 方差,越大,噪声越大
'''
image = cv2.imread(image)
image = np.array(image/255, dtype=float)#将原始图像的像素值进行归一化,除以255使得像素值在0-1之间
noise = np.random.normal(mean, var ** 0.5, image.shape)#创建一个均值为mean,方差为var呈高斯分布的图像矩阵
out = image + noise#将噪声和原始图像进行相加得到加噪后的图像
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)#clip函数将元素的大小限制在了low_clip和1之间了,小于的用low_clip代替,大于1的用1代替
out = np.uint8(out*255)#解除归一化,乘以255将加噪后的图像的像素值恢复
#cv.imshow("gasuss", out)
noise = noise*255
return [noise,out]
noise,out = gasuss_noise("colorful_lena.jpg", mean=0, var=0.003)
cv2.imshow('noise',noise)
cv2.imshow('out',out)
cv2.waitKey(0)
参考:https://blog.csdn.net/qq1483661204/article/details/78150203
numpy.clip(a, a_min, a_max, out=None)[source]
clip这个函数将将数组中的元素限制在a_min, a_max之间,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min
import numpy as np
x=np.array([1,2,3,5,6,7,8,9])
np.clip(x,3,8)
Out[88]:
array([3, 3, 3, 5, 6, 7, 8, 8])
其他噪声参考:《Python-图像加噪实现(Gaussian noise+salt and pepper noise)》