python随机添加噪声(高斯,椒盐,对比度高低)

class NoiseGenerator(object):
    def generated_noise(self, img, num):
        print("*****************")
        for i1, char in enumerate(num):
            if num[i1] == 0:
                img = self.original(img)
                print("原图")
            elif num[i1] == 1:
                img = self.gaussian_img(img)
                print("添加了高斯模糊")
            elif num[i1] == 2:
                img = self.salt_img(img)
                print("添加了椒盐噪声")
            elif num[i1] == 3:
                img = self.liner(img, a=2)
                print("增加了对比度")
            elif num[i1] == 4:
                img = self.liner(img, a=0.5)
                print("降低了对比度")
        return img

    def gaussian_img(self, img):  # 高斯模糊
        im = cv2.GaussianBlur(img, (9, 9), 5)
        return im

    def salt_img(self, img):  # 椒盐噪声
        n = int(img.shape[0] * img.shape[1] * 0.1)
        ilist = np.random.randint(0, img.shape[1], n)
        jlist = np.random.randint(0, img.shape[0], n)
        for k in range(n):
            i = ilist[k]
            j = jlist[k]
            if img.ndim == 2:
                img[j, i] = 255
            elif img.ndim == 3:
                img[j:j + 1, i:i + 1, :] = 255
        return img

    def liner(self, img, a):  # 线性变换,增强图像的对比度
        out_image = float(a) * img
        # 进行数据截断, 大于255的值要截断为255
        out_image[out_image > 255] = 255
        # 数据类型转化
        out_image = np.round(out_image)
        out_image = out_image.astype(np.uint8)
        return out_image

    def original(self, img):
        return img


if __name__ == '__main__':

    rd = NoiseGenerator()   # 调用创建的随机噪声类
    filenames = './positive_sample'  # 图像所在文件夹
    a = list(range(5))  # 最多2种噪声的叠加, range(A): 0 ~ A-1
    b = []
    # 随机抽取两类噪声所有的类型,这里相当于在五个数中随机抽取两个数
    for i in itertools.product(a, repeat=2):  
        b.append(i)

    for index, char in enumerate(b):  
# 获取所有可能类型的索引和数值,如index=0, char="0.jpg"
        i_name = 0  # 保存图像名称
        for image_name in os.listdir(filenames):  # image_name = "0.jpg"
            c = b[index]         # c=char,为了写循环,将char获取的图像名称用取索引的方式得到
            img_path = filenames + '/' + image_name  # 图像路径
            img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)  # 读取图像
            # 随机产生噪声,例如c=[2,3],则添加椒盐噪声和增加图像对比度
            result_image = rd.generated_noise(img, c)  
            # cv2.imshow("img1", result_image)
            # cv2.waitKey(0)
            index += 1
            # 在循环一次b中的所有情况后,index取得最大值25,将indedx置为0,继续循环
            if index == 25: 
                index = 0
            cv2.imwrite('./add_noise_sample/{}.jpg'.format(i_name), result_image)
            i_name += 1

你可能感兴趣的:(python,pycharm)