zoukankan      html  css  js  c++  java
  • 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     # 椒噪声
      

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

  • 相关阅读:
    LeetCode解题报告—— Permutations & Permutations II & Rotate Image
    LeetCode解题报告—— Combination Sum & Combination Sum II & Multiply Strings
    LeetCode解题报告—— Search in Rotated Sorted Array & Search for a Range & Valid Sudoku
    顺利通过EMC试验(2)
    CSS复合选择器
    Emmet快速生成HTML和CSS
    Spring 三种创建Bean的方式
    Spring BeanFactory和ApplicationContext的区别
    Spring ApplicationContext的三个实现类详解
    CSS的引入方式
  • 原文地址:https://www.cnblogs.com/negu/p/12718901.html
Copyright © 2011-2022 走看看