前言
在训练模型时,我们往往需要对图像进行增强以改善其质量或突出某些特征或增加样本的多样性。其中一种常见的图像增强方法是添加噪声。噪声可以模拟真实世界中的干扰因素,例如传感器噪声、传输误差等。通过向图像中添加噪声,我们可以测试和评估图像处理算法的性能,并提高其鲁棒性。
例如,在计算机视觉任务中,如果训练数据集中的图像都是干净且完美的,那么模型可能会对一些实际场景中的噪声和干扰因素无法适应。但是,如果我们在训练数据集中添加一些噪声,模型就会学会更好地处理这些噪声和干扰因素,从而提高其鲁棒性和泛化能力
高斯噪声
高斯噪声,是一种服从正态分布的随机噪声。这种噪声的特点是其概率密度函数符合高斯分布(正态分布),并且具有均值为零和方差为常数的特性
import random
import cv2
def add_noise(img,percentange,mu,sigma):
if len(img.shape) == 2:
channel_size =1
else:
channel_size =3
height,width = img.shape[0],img.shape[1]
num = int (height*width*percentange)
X_list = [random.randint(0,width-1) for i in range(num) ]
Y_list = [random.randint(0, height-1) for i in range(num)]
object_list = []
if channel_size ==1:
object_list.append(img)
else:
b,g,r = img[:,:,0],img[:,:,1],img[:,:,2]
object_list = [b,g,r]
for channel,object in enumerate(object_list):
for i,x in enumerate(X_list):
y = Y_list[i]
a = random.gauss(mu,sigma)
object_list[channel][y, x] = int(object[y, x] + a)
if channel_size ==1:
return object_list[0]
else:
result = cv2.merge(object_list)
return result
img_path = 'C:/Users/Administrator/Desktop/img/2.jpg'
img = cv2.imread(img_path)
cv2.imshow("img",img)
img = add_noise(img,0.2,0,0.1)
cv2.imshow("new_img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下:
椒盐噪声
椒盐噪声,又被称为脉冲噪声,是一种在图像处理中常见的噪声类型。这种噪声的特点是在图像中随机出现白点或黑点,或者两者都有。具体来说,这些噪声可能使原本亮的区域出现黑色像素,或者在暗的区域出现白色像素。
椒盐噪声的成因可能是由于影像讯号受到突如其来的强烈干扰而产生,或者是由类比数位转换器、解码处理等过程产生的。此外,椒盐噪声也被称为“雪花”,这是因为它在二值图像上表现为一些像素点的变白和一些像素点的变黑,形象地类似于天空中飘落的雪花
import random
import cv2
def add_noise(img,percentange):
if len(img.shape) == 2:
channel_size =1
else:
channel_size =3
height,width = img.shape[0],img.shape[1]
num = int (height*width*percentange)
X_list = [random.randint(0,width-1) for i in range(num) ]
Y_list = [random.randint(0, height-1) for i in range(num)]
object_list = []
if channel_size ==1:
object_list.append(img)
else:
b,g,r = img[:,:,0],img[:,:,1],img[:,:,2]
object_list = [b,g,r]
for channel,object in enumerate(object_list):
for i,x in enumerate(X_list):
y = Y_list[i]
a = random.random()
if a <0.5:
object_list[channel][y, x] = 0
else:
object_list[channel][y, x] = 255
if channel_size ==1:
return object_list[0]
else:
result = cv2.merge(object_list)
return result
img_path = 'C:/Users/Administrator/Desktop/img/2.jpg'
img = cv2.imread(img_path)
cv2.imshow("img",img)
img = add_noise(img,0.2)
cv2.imshow("new_img",img)
# 将图像窗口移动到指定位置
cv2.moveWindow("img", 500, 500)
cv2.moveWindow("new_img", 500, 500)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下: