涉及文件包括存放新的数据增强后的照片jpg文件和xml文件
原来的数据集文件
雾天数据增强原理
参考下文
(37条消息) 图片合成雾的方法概述_图像合成雾_Fighting_1997的博客
在看了原有的代码基础上主要需修改的是 cv2.imwrite(saveBasePath+'\\'+str(i)+'_'+'1'+'.jpg', img_f*255) ,将输入进来的图片修改保存为名字为如下格式
def demo(file_path,saveBasePath,i):
img_path = file_path # 图片地址和名称,默认是同一层文件地址,如有需要可更改。
img = cv2.imread(img_path)
img_f = img / 255.0 # 归一化
(row, col, chs) = img.shape
A = 0.5 # 亮度
# beta = 0.000005 # 雾的浓度
beta=0.1
#beta = betaa[random.randint(0,len(betaa)-1)] # 随机初始化雾的浓度
size = math.sqrt(max(row, col)) # 雾化尺寸,可根据自己的条件进行调节,一般的范围在中心点位置但不是很大,可自己手动设置参数
# size = 40 # 这是我自己设置的参数,效果很不错
center = (row // 2, col // 2) # 雾化中心 就是图片的中心
for j in range(row):
for l in range(col):
d = -0.04 * math.sqrt((j - center[0]) ** 2 + (l - center[1]) ** 2) + size
td = math.exp(-beta * d)
img_f[j][l][:] = img_f[j][l][:] * td + A * (1 - td) # 标准光学模型,图片的RGB三通道进行加雾
cv2.imwrite(saveBasePath+'\\'+str(i)+'_'+'1'+'.jpg', img_f*255) # 图片生成名字,切记务必要回复图片 *255,否则生成图片错误,可以尝试
进行xml中filename与path变量修改
def change_xml(xml_path, xml_new_path, image_savepath): # 转换标签函数
# 1.打开xml文档,并解析树
tree = ET.parse(xml_path) # 将xml解析为树
root = tree.getroot() # 获取根节点
# 2.修改filename和path
filename = root.find('filename')
path = root.find('path')
filename.text = image_savepath.split('\\')[-1]
path.text = image_savepath
# 3.调用树的方法write()保存更新XML文件(以UTF-8的格式保存)
tree.write(xml_new_path, 'UTF-8')
主函数撰写
只需要修改文中的文件路径,就可以生成名字为0_1.jpg~i_1.jpg的图片文件和xml文件,不过这是笨方法。
if __name__ == '__main__':
#原来图片的连接
file_path = r"E:\sdxx\insulator\JPEGImages"
#存放位置数据增强的图片
saveBasePath = r"E:\zsc\picture\jpg"
#数据增强后xml文件
xmlpath = r"E:\sdxx\insulator\Annotations"
xmlsavepath = r"E:\zsc\picture\xml"
total_image = os.listdir(file_path)
total_xml=os.listdir(xmlpath)
num=len(total_image)
list=range(num)
for i in list:
demo(file_path+'\\'+total_image[i],saveBasePath,i)
print(i)
shutil.copy(xmlpath+'\\'+total_xml[i], xmlsavepath+'\\')
os.rename(xmlsavepath+'\\'+total_xml[i],xmlsavepath+'\\'+str(i) + '_' + '1'+'.xml')
change_xml(xmlsavepath+'\\'+str(i) + '_' + '1'+'.xml',xmlsavepath+'\\'+str(i) + '_' + '1'+'.xml',saveBasePath+'\\'+str(i)+'_' + '1'+'.jpg')
完整代码
文件运行速度比较慢,主要是图片的计算速度,生成速度比较慢!数据量大可能得等一等。
import cv2, math
import os
import shutil
import xml.etree.ElementTree as ET
def demo(file_path,saveBasePath,i):
img_path = file_path # 图片地址和名称,默认是同一层文件地址,如有需要可更改。
img = cv2.imread(img_path)
img_f = img / 255.0 # 归一化
(row, col, chs) = img.shape
A = 0.5 # 亮度
# beta = 0.000005 # 雾的浓度
beta=0.1
#beta = betaa[random.randint(0,len(betaa)-1)] # 随机初始化雾的浓度
size = math.sqrt(max(row, col)) # 雾化尺寸,可根据自己的条件进行调节,一般的范围在中心点位置但不是很大,可自己手动设置参数
# size = 40 # 这是我自己设置的参数,效果很不错
center = (row // 2, col // 2) # 雾化中心 就是图片的中心
for j in range(row):
for l in range(col):
d = -0.04 * math.sqrt((j - center[0]) ** 2 + (l - center[1]) ** 2) + size
td = math.exp(-beta * d)
img_f[j][l][:] = img_f[j][l][:] * td + A * (1 - td) # 标准光学模型,图片的RGB三通道进行加雾
cv2.imwrite(saveBasePath+'\\'+str(i)+'_'+'1'+'.jpg', img_f*255) # 图片生成名字,切记务必要回复图片 *255,否则生成图片错误,可以尝试
def change_xml(xml_path, xml_new_path, image_savepath): # 转换标签函数
# 1.打开xml文档,并解析树
tree = ET.parse(xml_path) # 将xml解析为树
root = tree.getroot() # 获取根节点
# 2.修改filename和path
filename = root.find('filename')
path = root.find('path')
filename.text = image_savepath.split('\\')[-1]
path.text = image_savepath
# 3.调用树的方法write()保存更新XML文件(以UTF-8的格式保存)
tree.write(xml_new_path, 'UTF-8')
if __name__ == '__main__':
#原来图片的连接
file_path = r"E:\sdxx\insulator\JPEGImages"
#存放位置数据增强的图片
saveBasePath = r"E:\zsc\picture\jpg"
#数据增强后xml文件
xmlpath = r"E:\sdxx\insulator\Annotations"
xmlsavepath = r"E:\zsc\picture\xml"
total_image = os.listdir(file_path)
total_xml=os.listdir(xmlpath)
num=len(total_image)
list=range(num)
for i in list:
demo(file_path+'\\'+total_image[i],saveBasePath,i)
print(i)
shutil.copy(xmlpath+'\\'+total_xml[i], xmlsavepath+'\\')
os.rename(xmlsavepath+'\\'+total_xml[i],xmlsavepath+'\\'+str(i) + '_' + '1'+'.xml')
change_xml(xmlsavepath+'\\'+str(i) + '_' + '1'+'.xml',xmlsavepath+'\\'+str(i) + '_' + '1'+'.xml',saveBasePath+'\\'+str(i)+'_' + '1'+'.jpg')