图像噪声之高斯噪声(gauss noise)
概述:
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声与椒盐噪声相似(Salt And Pepper Noise),高斯噪声(gauss noise)也是数字图像的一个常见噪声。椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。比如说数字噪声中比较常见的噪声有:高斯噪声,椒盐噪声,泊松噪声,乘性噪声。
如果噪声的概率密度函数服从高斯分布的就叫做高斯噪声。如果噪声的分布服从泊松分布那么就是泊松噪声。下图是加入σ =0.05的高斯噪声图片。
批量处理数据
import cv2
import os
import numpy as np
import random
#添加高斯噪声
def gaussian_noise(img,mean,sigma):
'''
此函数将产生高斯噪声加到图片上
:param img:原图
:param mean:均值
:param sigma:标准差
:return:噪声处理后的图片
'''
img = img/255 #图片灰度标准化
noise = np.random.normal(mean, sigma, img.shape) #产生高斯噪声
# 将噪声和图片叠加
gaussian_out = img + noise
# 将超过 1 的置 1,低于 0 的置 0
gaussian_out = np.clip(gaussian_out, 0, 1)
# 将图片灰度范围的恢复为 0-255
gaussian_out = np.uint8(gaussian_out*255)
# 将噪声范围搞为 0-255
# noise = np.uint8(noise*255)
return gaussian_out# 这里也会返回噪声,注意返回值
def convert(input_dir, output_dir):
for filename in os.listdir(input_dir):
path = input_dir + "/" + filename # 获取文件路径
print("doing... ", path)
noise_img = cv2.imread(path)#读取图片
img_noise = gaussian_noise(noise_img, 0, 0.12) # 高斯噪声
# img_noise = sp_noise(noise_img,0.025)# 椒盐噪声
#img_noise = random_noise(noise_img,500)# 随机噪声
cv2.imwrite(output_dir+'/'+filename,img_noise )
if __name__ == '__main__':
input_dir = "C:\\Users\\ljs\\Desktop\\NumberLabels_gaubefor" # 输入数据文件夹
output_dir = "C:\\Users\\ljs\\Desktop\\gao_after" # 输出数据文件夹
convert(input_dir, output_dir)
随机HSV增强
讲解链接
数据增强:随机HSV增强_hsv数据增强_Le0v1n的博客-CSDN博客
批量处理数据
import os
import cv2
import imageio
import numpy as np
import matplotlib.pyplot as plt
from skimage import io
def augment_hsv(img, h_gain=0.5, s_gain=0.5, v_gain=0.5):
"""
hsv增强 处理图像hsv,不对label进行任何处理
:param img: 待处理图片 BGR [736, 736]
:param h_gain: h通道色域参数 用于生成新的h通道
:param s_gain: h通道色域参数 用于生成新的s通道
:param v_gain: h通道色域参数 用于生成新的v通道
:return: 返回hsv增强后的图片 img
"""
# 从-1~1之间随机生成3随机数与三个变量进行相乘
r = np.random.uniform(-1, 1, 3) * [h_gain, s_gain, v_gain] + 1 # random gains
hue, sat, val = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))
dtype = img.dtype # uint8
# 分别针对hue, sat以及val生成对应的Look-Up Table(LUT)查找表
x = np.arange(0, 256, dtype=np.int16)
lut_hue = ((x * r[0]) % 180).astype(dtype)
lut_sat = np.clip(x * r[1], 0, 255).astype(dtype)
lut_val = np.clip(x * r[2], 0, 255).astype(dtype)
# 使用cv2.LUT方法利用刚刚针对hue, sat以及val生成的Look-Up Table进行变换
img_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val))).astype(dtype)
aug_img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR, dst=img) # no return needed
# 这里源码是没有进行return的,不过我还是觉得return一下比较直观了解
return aug_img
if __name__ == '__main__':
#获取图像列表,此处为原始图像所在路径
files = os.listdir("C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after")
s=0
m=0
for file in files:
#按照获取的列表依次读取列表,路径同上
img = io.imread('C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after\\' + os.path.splitext(file)[0] + '.jpg')
img_out = augment_hsv(img)
# plt.figure()
# plt.subplot(1, 2, 1)
# plt.imshow(img)
# plt.subplot(1, 2, 2)
# plt.imshow(img_out)
# plt.show()
s = s + 1
#路径为结果保存路径
imageio.imwrite("C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after_HSV\\" + os.path.splitext(file)[0][:4] + "_{}.jpg".format(s), img_out)
print('已处理完{}张照片'.format(s))
旋转
# -*- coding: UTF-8 -*-
from PIL import Image
import os
def get_filelist(path):
Filelist = []
for home, dirs, files in os.walk(path):
for filename in files:
# 文件名列表,包含完整路径
Filelist.append(os.path.join(home, filename))
# # 文件名列表,只包含文件名
# Filelist.append( filename)
return Filelist
if __name__ == "__main__":
filePath = 'C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after'
# 指定保存的文件夹
outputPath = 'C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after_rotate'
# 获得文件夹下所有文件
# filePath = './imgs/' # 只能获取当前路径下的文件,不能递归
# filenames = os.listdir(filePath)
Filelist = get_filelist(filePath)
print(len(Filelist))
# 迭代所有图片
for filename in Filelist:
print(filename)
# 读取图像
im = Image.open(filename)
# 指定逆时针旋转的角度
im_rotate = im.transpose(Image.ROTATE_90)
# im_rotate = im.transpose(Image.ROTATE_180)
# im_rotate = im.transpose(Image.ROTATE_270)
# 保存图像
output_path = filename.replace(filePath, outputPath)
outputdir = output_path.rsplit('\\', 1)[0]
if not os.path.exists(outputdir):
os.mkdir(outputdir)
im_rotate.save(output_path)
缩放
from PIL import Image
import os
fin = "C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after" # 输入图像所在路径
fout = "C:\\Users\\bellajj\\Desktop\\data_augument\\20230701after_suofang" # 输出图像的路径
for file in os.listdir(fin):
file_fullname = fin + '/' +file
print(file_fullname) # 所操作图片的名称可视化
img = Image.open(file_fullname)
im_resized = img.resize((1000, 1000)) # resize至所需大小
out_path = fout + '/' + file
im_resized.save(out_path) # 保存图像