菜鸟实战——python数据集增强|模拟雾天|同时修改JPG和XML文件

涉及文件包括存放新的数据增强后的照片jpg文件和xml文件

原来的数据集文件

  1. 雾天数据增强原理

参考下文

(37条消息) 图片合成雾的方法概述_图像合成雾_Fighting_1997的博客-CSDN博客

在看了原有的代码基础上主要需修改的是 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,否则生成图片错误,可以尝试
  1. 进行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')
  1. 主函数撰写

只需要修改文中的文件路径,就可以生成名字为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')
  1. 完整代码

文件运行速度比较慢,主要是图片的计算速度,生成速度比较慢!数据量大可能得等一等。

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')
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值