Little_by_little_4 创建一个椒盐噪声的pytorch.transform

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调用函数的时候是这样的。

image-20200416094444822

  •         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     # 椒噪声
    

    将原图加上盐噪声和椒噪声

posted @ 2020-04-17 11:56  negu  阅读(846)  评论(0编辑  收藏  举报