"""
本代码共采用了四种数据增强,如采用其他数据增强方式,可以参考本代码,随意替换。
imageDir 为原数据集的存放位置
saveDir 为数据增强后数据的存放位置
"""
'''
def flip(root_path,img_name): #翻转图像
img = Image.open(os.path.join(root_path, img_name))
if img.mode == "P":
img = img.convert('RGB')
elif img.mode == "RGBA":
img = img.convert('RGB')
filp_img = img.transpose(Image.FLIP_LEFT_RIGHT)
# filp_img.save(os.path.join(root_path,img_name.split('.')[0] + '_flip.jpg'))
return filp_img
def rotation(root_path, img_name): #图像旋转
img = Image.open(os.path.join(root_path, img_name))
if img.mode == "P":
img = img.convert('RGB')
elif img.mode == "RGBA":
img = img.convert('RGB')
theta = random.randint(0,180)
rotation_img = img.rotate(theta) #旋转角度
# rotation_img.save(os.path.join(root_path,img_name.split('.')[0] + '_rotation.jpg'))
return rotation_img
def randomColor(root_path, img_name): #随机颜色
#对图像进行颜色抖动
#:param image: PIL的图像image
#:return: 有颜色色差的图像image
image = Image.open(os.path.join(root_path, img_name))
random_factor = np.random.randint(0, 41) / 10. # 随机因子
color_image = ImageEnhance.Color(image).enhance(random_factor) # 调整图像的饱和度
random_factor = np.random.randint(10, 31) / 10. # 随机因子
brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor) # 调整图像的亮度
random_factor = np.random.randint(10, 31) / 10. # 随机因子
contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor) # 调整图像对比度
random_factor = np.random.randint(0, 41) / 10. # 随机因子
return ImageEnhance.Sharpness(contrast_image).enhance(random_factor) # 调整图像锐度
def contrastEnhancement(root_path, img_name): # 对比度增强
image = Image.open(os.path.join(root_path, img_name))
enh_con = ImageEnhance.Contrast(image)
contrast = 2
image_contrasted = enh_con.enhance(contrast)
return image_contrasted
def brightnessEnhancement(root_path, img_name):#亮度增强
image = Image.open(os.path.join(root_path, img_name))
enh_bri = ImageEnhance.Brightness(image)
brightness = 2
image_brightened = enh_bri.enhance(brightness)
return image_brightened
def colorEnhancement(root_path, img_name):#颜色增强
image = Image.open(os.path.join(root_path, img_name))
enh_col = ImageEnhance.Color(image)
color = 2
image_colored = enh_col.enhance(color)
return image_colored
def translations(img_name):#图像平移(向右下角随机在0-50之间平移)
#image = Image.open(os.path.join(root_path, img_name))
height, width, channels = img_name.shape
emptyImage2 = img_name.copy()
x= random.randint(0,50)
y= random.randint(0,50)
for i in range(height):
for j in range(width):
if i>=x and j>=y:
emptyImage2[i,j]=img_name[i-x][j-y]
else:
emptyImage2[i,j]=(0,0,0)
return emptyImage2
#img = cv2.imread("C:\\Users\\PC\\Desktop\\video-detection\\normal3.jpg")
#cv2.namedWindow("Image")
#SaltImage=move(image)
#cv2.imshow("Image",image)
#cv2.imshow("ss",SaltImage)
#cv2.waitKey(0)
#随机生成符合正态(高斯)分布的随机数,高斯噪声
def GaussianNoise(root_path,img_name):
image=Image.open(os.path.join(root_path, img_name))
means = 2
sigma = 4
percetage = 0.5
imageNum=int(percetage*image.shape[0]*image.shape[1])
for i in range(imageNum):
randX=random.randint(0,image.shape[0]-1)
randY=random.randint(0,image.shape[1]-1)
#此处在原有像素灰度值上加上随机数
image[randX,randY]=image[randX,randY]+random.gauss(means,sigma)
#若灰度值小于0则强制为0,若灰度值大于255则强制为255
if image[randX, randY]< 0:
image[randX, randY]=0
elif image[randX, randY]>255:
image[randX, randY]=255
return image
#椒盐噪声加噪
def Salt_pepper_noise(root_path,img_name):
image=Image.open(os.path.join(root_path, img_name))
percetage = 0.2
imageNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(imageNum): #返还一个迭代器
#把一张图片的像素用行和列表示的话,randX 代表随机生成的行,randY代表随机生成的列
#random.randint生成随机整数
#椒盐噪声图片边缘不处理,故-1
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
#random.random生成随机浮点数,随意取到一个像素点有一半的可能是白点255,一半的可能是黑点0
if random.random()<=0.5:
image[randX,randY]=0
else:
image[randX,randY]=255
return image
from PIL import Image
from PIL import ImageEnhance
import os
import cv2
import numpy as np
import math
import random
imageDir="C:\\Users\\PC\\Desktop\\光交光分光猫数据集\\new-pictures\\" #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\光交光分光猫数据集\\增强\\" #要保存的图片的路径文件夹
for name in os.listdir(imageDir):
#saveName = name[:-4]+"id.jpg"
#image = Image.open(os.path.join(imageDir, name))
#image.save(os.path.join(saveDir, saveName))
# 随机颜色
# saveName = name[:-4] + "rC.jpg"
# saveImage = randomColor(imageDir, name)
# saveImage.save(os.path.join(saveDir, saveName))
#亮度增强
# saveName = name[:-4]+"be.jpg"
# saveImage = brightnessEnhancement(imageDir, name)
# saveImage.save(os.path.join(saveDir, saveName))
#翻转
#saveName = name[:-4]+"fl.png"
#saveImage = flip(imageDir, name)
#saveImage.save(os.path.join(saveDir, saveName))
#旋转
#saveName = name[:-4]+"ro.jpg"
#saveImage = rotation(imageDir, name)
#saveImage.save(os.path.join(saveDir, saveName))
#对比度增强
#saveName = name[:-4]+"cotrE.png"
#saveImage = contrastEnhancement(imageDir, name)
#saveImage.save(os.path.join(saveDir, saveName))
#颜色增强
# saveName = name[:-4]+"colorE.jpg"
# saveImage = colorEnhancement(imageDir, name)
# saveImage.save(os.path.join(saveDir, saveName))
#高斯噪声
#saveName = name[:-4]+"GN.jpg"
#saveImage = GaussianNoise(os.path.join(imageDir, Name))
#saveImage.save(os.path.join(saveDir, saveName))
#椒盐噪声
#saveName = name[:-4]+"Spn.jpg"
#saveImage = Salt_pepper_noise(os.path.join(imageDir, name))
#saveImage.save(os.path.join(saveDir, saveName))
#平移
#saveName = name[:-4]+"tr.jpg"
#saveImage = translations(name)
#saveImage.save(os.path.join(saveDir, saveName))
'''
#对图片进行平移
import os
import random
import cv2
import math
import numpy as np
def move(image):
#print(image)
height, width, channels = image.shape
emptyImage2 = image.copy()
x= random.randint(0,50)
y= random.randint(0,50)
for i in range(height):
for j in range(width):
if i>=x and j>=y:
emptyImage2[i,j]=image[i-x][j-y]
else:
emptyImage2[i,j]=(0,0,0)
return emptyImage2
imageDir="C:\\Users\\PC\\Desktop\\2\\new-pictures\\" #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\2\\1\\" #要保存的图片的路径文件夹
for name in os.listdir(imageDir):
img=cv2.imread(os.path.join(imageDir, name))
#img = cv2.imread("C:\\Users\\PC\\Desktop\\video-detection\\normal3.jpg")
print(img)
#cv2.namedWindow("Image")
SaltImage=move(img)
saveName = name[:-4] + "move.jpg"
cv2.imwrite(os.path.join(saveDir, saveName),SaltImage)
#cv2.imshow("Image",img)
#cv2.imshow("ss",SaltImage)
#cv2.waitKey(0)
"""
import numpy as np
import random
import cv2
def sp_noise(image,prob):
'''
添加椒盐噪声
prob:噪声比例
'''
output = np.zeros(image.shape,np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = image[i][j]
return output
def gasuss_noise(image, mean=0, var=0.001):
'''
添加高斯噪声
mean : 均值
var : 方差
'''
image = np.array(image/255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out*255)
#cv.imshow("gasuss", out)
return out
"""
'''
import numpy as np
import cv2 #pip install opencv_python
from numpy import shape
import random
import os
def fun1(src,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum): #返还一个迭代器
#把一张图片的像素用行和列表示的话,randX 代表随机生成的行,randY代表随机生成的列
#random.randint生成随机整数
#椒盐噪声图片边缘不处理,故-1
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
#random.random生成随机浮点数,随意取到一个像素点有一半的可能是白点255,一半的可能是黑点0
if random.random()<=0.5:
NoiseImg[randX,randY]=0
else:
NoiseImg[randX,randY]=255
return NoiseImg
imageDir="C:\\Users\\PC\\Desktop\\2\\" #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\3\\" #要保存的图片的路径文件夹
for name in os.listdir(imageDir):
#导入图片
img=cv2.imread(os.path.join(imageDir, name),0)
#调fun1函数,0.2为参数信噪比设定
img1=fun1(img,0.2)
#在文件夹中写入命名为PepperandSalt.jpg的加噪后的图片
saveName = name[:-4] + "noise.jpg"
cv2.imwrite(os.path.join(saveDir, saveName),img1)
#展示加噪后的图片
#cv2.imshow('PepperandSalt',img1)
#cv2.waitKey(0)
'''
#随机生成符合正态(高斯)分布的随机数,means,sigma为两个参数
"""
import numpy as np
import cv2
from numpy import shape
import random
def GaussianNoise(src,means,sigma,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
#此处在原有像素灰度值上加上随机数
NoiseImg[randX,randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)
#若灰度值小于0则强制为0,若灰度值大于255则强制为255
if NoiseImg[randX, randY]< 0:
NoiseImg[randX, randY]=0
elif NoiseImg[randX, randY]>255:
NoiseImg[randX, randY]=255
return NoiseImg
img=cv2.imread('C:\\Users\\PC\\Desktop\\video-detection\\normal3.jpg',0)
img1=GaussianNoise(img,2,4,0.5)
cv2.imwrite('C:\\Users\\PC\\Desktop\\video-detection\\GaussianNoise.jpg',img1)
cv2.imshow('C:\\Users\\PC\\Desktop\\video-detection\\GaussianNoise',img1)
cv2.waitKey(0)
"""
"""
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
import sys
import copy
#python 图像翻转,自定义翻转
img = cv.imread('C:\\Users\\PC\\Desktop\\video-detection\\normal3.jpg')
if img.all()==None:
print('No Such image!')
sys.exit(0)
size = img.shape
iCopy = copy.deepcopy(img)
iCopy1 = copy.deepcopy(img)
iCopy2 = copy.deepcopy(img)
h = size[0]
w = size[1]
for i in range(h):
for j in range(w):
iCopy[i,w-1-j] = img[i,j]#水平镜像
iCopy1[h-1-i,j] = img[i,j]#垂直镜像
iCopy2[h-1-i,w-1-j] = img[i,j]#对角镜像
plt.subplot(221),plt.imshow(img)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(iCopy)
plt.title('Remap shuiping Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(iCopy1)
plt.title('Remap chuizhi Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(iCopy2)
plt.title('Remap duijiao Image'), plt.xticks([]), plt.yticks([])
plt.show()
#python 图像翻转,使用openCV flip()方法翻转
xImg = cv.flip(img,1,dst=None) #水平镜像
xImg1 = cv.flip(img,0,dst=None) #垂直镜像
xImg2 = cv.flip(img,-1,dst=None) #对角镜像
plt.subplot(221),plt.imshow(img)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(xImg)
plt.title('Remap shuiping Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(xImg1)
plt.title('Remap chuizhi Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(xImg2)
plt.title('Remap duijiao Image'), plt.xticks([]), plt.yticks([])
plt.show()
"""
#图像模糊处理
# coding: utf-8
"""
import numpy as np
import cv2
import os
def motion_blur(image, degree=20, angle=45):
image = np.array(image)
# 这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越高
M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1)
motion_blur_kernel = np.diag(np.ones(degree))
motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree))
motion_blur_kernel = motion_blur_kernel / degree
blurred = cv2.filter2D(image, -1, motion_blur_kernel)
# convert to uint8
cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)
blurred = np.array(blurred, dtype=np.uint8)
return blurred
imageDir="C:\\Users\\PC\\Desktop\\pictures\\" #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\project-pictures\\" #要保存的图片的路径文件夹
for name in os.listdir(imageDir):
img = cv2.imread(os.path.join(imageDir, name))
img_blur = motion_blur(img)
saveName = name[:-4] + "blur2.jpg"
cv2.imwrite(os.path.join(saveDir, saveName),img_blur)
#cv2.imshow('Source image',img)
#cv2.imshow('blur image',img_blur)
#cv2.waitKey()
"""
"""
#对图片画线
import cv2
import numpy as np
import os
import random
imageDir="C:/Users/PC/Desktop/image/" #要改变的图片的路径文件夹
#saveDir="C:/Users/PC/Desktop/1/" #要保存的图片的路径文件夹
for name in os.listdir(imageDir):
img = cv2.imread(os.path.join(imageDir, name))
#img = cv2.imread("C:/Users/PC/Desktop/image/000008.jpg")
print(img.shape[0])
print(img.shape[1])
#newImg = (500,500,3) #这里是创建一个空图片500x500 深度为3的彩色图片
#dst = np.zeros(img,np.uint8)
#line参数解析 1 图片 2 begin 3 end 4 color 5 line width 6 line style
#cv2.line(img,(100,100),(400,400),(0,0,255))#画一条红色的线
#x = random.radint(0,100)
#for j in range(6,random.randint(15,20)):
y = random.randint(1,img.shape[0])
g = random.randint(1,img.shape[0]-300)
z = random.randint(1,50)
x = random.randint(51,100)
i = random.randint(101,150)
j = random.randint(151,200)
cv2.line(img,(0,y),(img.shape[1],y),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6)) #画一条宽度为4的线
cv2.line(img,(0,y-z),(img.shape[1],y-z),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6))
cv2.line(img,(0,y-x),(img.shape[1],y-x),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6))
cv2.line(img,(0,y-i),(img.shape[1],y-i),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6))
cv2.line(img,(0,y-j),(img.shape[1],y-j),(random.randint(0,255),random.randint(0,255),random.randint(0,255)),random.randint(1,6))
savename = name[:-4] + "id1.jpg"
#cv2.imshow('test',img)
img1 = img
cv2.imwrite("C:/Users/PC/Desktop/1/" + savename, img)
#cv2.imshow('test',img)
#cv2.imwrite(os.path.join(saveDir, savename), img1)
#cv2.waitKey(0)
"""
"""
#镜像
import cv2
import numpy as np
import os
imageDir="" #要改变的图片的路径文件夹
saveDir="" #要保存的图片的路径文件夹
for name in os.listdir(imageDir):
img=cv2.imread(os.path.join(imageDir, name))
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
dst = np.zeros([height*2, width, deep], np.uint8)
for i in range(height):
for j in range(width):
dst[i,j] = img[i,j]
dst[height*2-i-1,j] = img[i,j]
for i in range(width):
dst[height, i] = (0, 0, 255)
saveName = name[:-4] + "mirror.jpg"
cv2.imwrite(os.path.join(saveDir, saveName),dst)
#cv2.imshow('image', dst)
cv2.waitKey(0)
"""
"""
#仿射
import cv2
import numpy as np
import os
imageDir="C:\\Users\\PC\\Desktop\\pictures\\" #要改变的图片的路径文件夹
saveDir="C:\\Users\\PC\\Desktop\\project-pictures\\" #要保存的图片的路径文件夹
for name in os.listdir(imageDir):
img=cv2.imread(os.path.join(imageDir, name))
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
# src 3 -> dst 3 (左上角, 左下角,右上角)
matSrc = np.float32([[0,0],[0,height-1],[width-1, 0]]) # 需要注意的是 行列 和 坐标 是不一致的
matDst = np.float32([[50,50],[100, height-50],[width-200,100]])
matAffine = cv2.getAffineTransform(matSrc,matDst) #mat 1 src 2 dst 形成组合矩阵
dst = cv2.warpAffine(img, matAffine,(height, width))
saveName = name[:-4] + "affine.jpg"
cv2.imwrite(os.path.join(saveDir, saveName),dst)
cv2.waitKey(0)
"""
上述代码,是其他博客中的代码,原链接忘记了,如有看到,请提醒。
部分代码未调通。