import sys import random import cv2 import numpy as np import matplotlib.pyplot as plt def addNoisy(img_path, type, para1, para2): img = cv2.imread(img_path) # 读取图片 out = np.zeros(img.shape, np.uint8) if type == 1: # 添加高斯噪声------------------------------------------------------- # 将图片的像素值归一化,存入矩阵中 img = np.array(img / 255, dtype=float) # 生成正态分布的噪声,其中0表示均值,0.1表示方差 noise = np.random.normal(para1, para2, img.shape) # 参数:正态分布的均值和方差,可自定义 # 将噪声叠加到图片上 out = img + noise # 将图像的归一化像素值控制在0和1之间,防止噪声越界 out = np.clip(out, 0.0, 1.0) # 将图像的像素值恢复到0到255之间 out = np.uint8(out * 255) cv2.imwrite('./output/Gaussian_noisy.jpg', out) elif type == 2: # 添加椒盐噪声-------------------------------------------------------- # 遍历图像,获取叠加噪声后的图像 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for i in range(img.shape[0]): for j in range(img.shape[1]): rdn = random.random() if rdn < para1: # 添加椒噪声 out[i][j] = 0 elif rdn > para2: # 添加盐噪声 out[i][j] = 255 else: # 不添加噪声 out[i][j] = img[i][j] cv2.imwrite('./output/saltnoisy.jpg', out) ''' 输入:img_path:图片地址 type:噪声类型(1为高斯噪声,2为椒盐噪声) para1,para2:如果添加的是高斯噪声,para1为正态分布均值,para2为正态分布方差 如果添加的是椒盐噪声,para1为添加椒噪声阈值,para2为添加盐噪声阈值 输出:添加了噪声的图片 ''' if __name__ == '__main__': addNoisy(sys.argv[1], eval(sys.argv[2]), eval(sys.argv[3]), eval(sys.argv[4]))