其他分享
首页 > 其他分享> > Little_by_little_4 创建一个椒盐噪声的pytorch.transform

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

#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

image-20200416094444822

标签:Little,椒盐,img,噪声,self,mask,little,pct,snr
来源: https://www.cnblogs.com/negu/p/12718901.html