python实现向图像随机添加高斯白噪声,并修改尺寸

基于python向图像随机添加高斯噪声,并修改尺寸
噪声分布设置为(均值为0,方差分布在0~50之间)

# -*- coding: utf-8 -*-
"""
Created on Nov Mon  29 14:09:45 2021

@author: 瀛台夜雪
"""
import os
import numpy as np
import cv2
import glob

 
def main():
  
  src_dir='./example/'
  save_dir = './example/train'
  src_dir_test='./example/test'
  save_dir_test = './example/test'

  #遍历文件夹下所有的图片
  filepaths = glob.glob(save_dir + '/*.jpg')
  filepaths_test = glob.glob(src_dir_test + '/*.jpg')
  def sortKeyFunc(s):
    return int(os.path.basename(s)[:-4])
  #os.path.basename()返回path最后的文件名,[:-4],取后缀前的名字
    
  filepaths_test.sort(key=sortKeyFunc)
  filepaths.sort(key=sortKeyFunc)
  
  
  print("[*] Reading train files...")

#如果地址不存在,创建新地址文件夹
  if not os.path.exists(save_dir):
        os.mkdir(save_dir)
        os.mkdir(save_dir_test)
        os.mkdir('./example/train/noisy')
        os.mkdir('./example/train/original')
        os.mkdir('./example/test/noisy')
        os.mkdir('./example/test/original')

  print("[*] Applying noise...")

# np.linspace(start,stop,num)创建等差数列
  sig = np.linspace(0,50,len(filepaths))
  np.random.shuffle(sig)
  # print(sig)
  sig_test = np.linspace(0,50,len(filepaths_test))
  np.random.shuffle(sig_test)

  for i in range(len(filepaths)):
        image = cv2.imread(filepaths[i])
        #将图片变换成180*180大小的图片
        image = cv2.resize(image,(180,180), interpolation = cv2.INTER_CUBIC)
        row,col,ch = image.shape
        mean = 0
        sigma = sig[i]
        # print("this is train sigma")
        # print(sigma)

#np.random.normal(loc=mean,scale=sigma,size=(row,col,ch))生成高斯分布的概率密度随机数,均值,方差,输入样式
#建立方差随机的高斯噪声,方差分布在0到50之间
        gauss = np.random.normal(mean,sigma,(row,col,ch))
        gauss = gauss.reshape(row,col,ch)
        noisy = image + gauss
#np.clip(a,a_min,a_max)将输入的原始a限制在a_min与a_max之间,小于a_min赋值为a_min,大于a_max赋值为a_max
        noisy = np.clip(noisy, 0, 255)
#noise.astype('uint8'),转变数据类型为uint8型,uint8为8位无符号整数类型,表示范围为[0:255]
        noisy = noisy.astype('uint8')
        cv2.imwrite(os.path.join(save_dir, "noisy/%04d.png" %i), noisy)
        cv2.imwrite(os.path.join(save_dir, "original/%04d.png" %i), image)
        
  for i in range(len(filepaths_test)):
        image = cv2.imread(filepaths_test[i])
        image = cv2.resize(image,(180,180), interpolation = cv2.INTER_CUBIC)
        row,col,ch = image.shape
        mean = 0
        sigma = sig[i]
        # print("this is test sigma")
        # print(sigma)
        gauss = np.random.normal(mean,sigma,(row,col,ch))
        gauss = gauss.reshape(row,col,ch)
        noisy = image + gauss
        noisy = np.clip(noisy, 0, 255)
        noisy = noisy.astype('uint8')     
        cv2.imwrite(os.path.join(save_dir_test, "noisy/%d.png" %i), noisy)
        cv2.imwrite(os.path.join(save_dir_test, "original/%d.png" %i), image)
  
  print("[*] Noisy and original images saved")

if __name__ == "__main__":
 main()

原始图像:
原始图像
噪声图像:
在这里插入图片描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值