Little_by_little_4 创建一个椒盐噪声的pytorch.transform
任务:
为一个图片加上椒盐噪声,创造一个类实现这个功能
源代码
class AddPepperNoise(object):
"""增加椒盐噪声
Args:
snr (float): Signal Noise Rate
p (float): 概率值,依概率执行该操作
"""
#1
def __init__(self, snr, p=0.9):
assert isinstance(snr, float) or (isinstance(p, float))
self.snr = snr
self.p = p
#2
def __call__(self, img):
"""
Args:
img (PIL Image): PIL Image
Returns:
PIL Image: PIL image.
"""
if random.uniform(0, 1) < self.p:#概率的判断
img_ = np.array(img).copy()#转化为numpy的形式
h, w, c = img_.shape#获取图像的高,宽,channel的数量
signal_pct = self.snr#设置图像原像素点保存的百分比
noise_pct = (1 - self.snr)#噪声的百分比
mask = np.random.choice((0, 1, 2), size=(h, w, 1), p=[signal_pct, noise_pct/2., noise_pct/2.])
#random.choice的用法:可以从一个int数字或1维array里随机选取内容,并将选取结果放入n维array中返回。
#size表示要输出的numpy的形状
mask = np.repeat(mask, c, axis=2)#将mask在最高轴上(2轴)上复制channel次。
img_[mask == 1] = 255 # 盐噪声
img_[mask == 2] = 0 # 椒噪声
return Image.fromarray(img_.astype(\'uint8\')).convert(\'RGB\')#转化成pil_img的形式
else:
return img
#1 分析
def __init__(self, snr, p=0.9):
assert isinstance(snr, float) or (isinstance(p, float))
self.snr = snr
self.p = p
- 初始化一些参数,snr代表保留原像素点的百分比,p代表执行椒盐噪声变化的概率。
#2 分析
def __call__(self, img):
"""
Args:
img (PIL Image): PIL Image
Returns:
PIL Image: PIL image.
"""
if random.uniform(0, 1) < self.p:#概率的判断
img_ = np.array(img).copy()#转化为numpy的形式
h, w, c = img_.shape#获取图像的高,宽,channel的数量
signal_pct = self.snr#设置图像原像素点保存的百分比
noise_pct = (1 - self.snr)#噪声的百分比
mask = np.random.choice((0, 1, 2), size=(h, w, 1), p=[signal_pct, noise_pct/2., noise_pct/2.])
#random.choice的用法:可以从一个int数字或1维array里随机选取内容,并将选取结果放入n维array中返回。
#size表示要输出的numpy的形状
#p = 一个一维数组,制定了每个元素被采样的概率,若为默认的None,则a中每个元素被采样的概率相同。
mask = np.repeat(mask, c, axis=2)#将mask在最高轴上(2轴)上复制channel次。
img_[mask == 1] = 255 # 盐噪声
img_[mask == 2] = 0 # 椒噪声
return Image.fromarray(img_.astype(\'uint8\')).convert(\'RGB\')#转化成pil_img的形式
else:
return img
- 为什么要在_call_里面编写?->因为在transform.compose调用函数的时候是这样的。
-
if random.uniform(0, 1) < self.p:#概率的判断 img_ = np.array(img).copy()#转化为numpy的形式 h, w, c = img_.shape#获取图像的高,宽,channel的数量 signal_pct = self.snr#设置图像原像素点保存的百分比 noise_pct = (1 - self.snr)#噪声的百分比
一些对接收img的一些前处理。
-
mask = np.random.choice((0, 1, 2), size=(h, w, 1), p=[signal_pct, noise_pct/2., noise_pct/2.])
问题:如果要给原图片随机像素点加上黑白噪点,那么如何选取哪些像素点要加噪点?哪些像素点保持原样呢? 一般都是创建一个原图相同维度的mask然后里面随机选点,用这个mask决定原图哪个像素点要变成黑白噪声。主要是关注random.choice的用法 -
mask = np.repeat(mask, c, axis=2)
将mask在最高轴上(2轴)上复制channel次。 -
img_[mask == 1] = 255 # 盐噪声 img_[mask == 2] = 0 # 椒噪声
将原图加上盐噪声和椒噪声