语义分割之使用自己的代码进行数据增强

前言
网上的包,写着写着,就不耐烦了,还是自己写吧

注释掉的部分 是对json文件的修改 如果大家想顺便修改json文件就将注释给删去

import cv2
import os
import shutil
import json
import base64
import random
import numpy as np
import random
from tqdm import tqdm
from PIL import Image

def image_to_base64(image_path):
    # 读取二进制图片,获得原始字节码
    with open(image_path, 'rb') as jpg_file:
        byte_content = jpg_file.read()

    # 把原始字节码编码成base64字节码
    base64_bytes = base64.b64encode(byte_content)

    # 把base64字节码解码成utf-8格式的字符串
    base64_string = base64_bytes.decode('utf-8')

    return base64_string

def make_dir(img_save_path,mask_save_path,json_save_path):
    if not os.path.exists(json_save_path):
        os.makedirs(json_save_path)
    if not os.path.exists(mask_save_path):
        os.makedirs(mask_save_path)
    if not os.path.exists(img_save_path):
        os.makedirs(img_save_path)
        img_name_list = os.listdir(img_path)
        base_num = len(img_name_list)
        print(f'base_num = {base_num}')
    else:
        img_save_list = os.listdir(img_save_path)
        img_save_list = [int(i.split('.')[0]) for i in img_save_list]
        base_num = max(img_save_list)
    return base_num


def flip_left_right(img_path,mask_path,json_path,save_path):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path, "output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)
    # os.makedirs(json_save_path,exist_ok=True)
    # os.makedirs(img_save_path,exist_ok=True)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        num = int(img_name.split('.')[0]) +base_num

        # 打开图片
        img = Image.open(os.path.join(img_path,img_name))
        width, height = img.size
        # 左右翻转
        img = img.transpose(Image.FLIP_LEFT_RIGHT)
        img.save(f'{img_save_path}/{num}.jpg')
        #shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')

        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
        mask.save(f'{mask_save_path}/{num}.png')


        # with open(f'{json_save_path}/{num}.json', 'r') as f:
        #     data = json.load(f)
        # base64_string = image_to_base64(f'{img_save_path}/{num}.jpg')
        # data["imageData"]= base64_string
        # #data_shapes是一个列表 列表里面包含的元素是字典
        # data_shapes = data['shapes']
        # for label_index,label_points in  enumerate(data_shapes):
        #     points = label_points['points']
        #     for poindt_index,point in enumerate(points):
        #         x,y = point
        #         new_x = (width-x)
        #         points[poindt_index] = (new_x, y)
        # # 将修改后的数据重新写入json文件
        # with open(json_save_path + '/' + str(num) + '.json', 'w') as f:
        #     json.dump(data, f)
        pbar.update(1)

def flip_top_bottom(img_path,mask_path,json_path,save_path):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path,"output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)
    # os.makedirs(json_save_path,exist_ok=True)
    # os.makedirs(img_save_path,exist_ok=True)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        num = int(img_name.split('.')[0]) +base_num


        # 打开图片
        img = Image.open(os.path.join(img_path,img_name))
        width, height = img.size
        # 左右翻转
        img = img.transpose(Image.FLIP_TOP_BOTTOM)
        img.save(f'{img_save_path}/{num}.jpg')
        #shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')

        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask = mask.transpose(Image.FLIP_TOP_BOTTOM)
        mask.save(f'{mask_save_path}/{num}.png')

        # with open(f'{json_save_path}/{num}.json', 'r') as f:
        #     data = json.load(f)
        # base64_string = image_to_base64(f'{img_save_path}/{num}.jpg')
        # data["imageData"]= base64_string
        # #data_shapes是一个列表 列表里面包含的元素是字典
        # data_shapes = data['shapes']
        # for label_index,label_points in  enumerate(data_shapes):
        #     points = label_points['points']
        #     for poindt_index,point in enumerate(points):
        #         x,y = point
        #         new_y = (height-y)
        #         points[poindt_index] = (x, new_y)
        # # 将修改后的数据重新写入json文件
        # with open(json_save_path + '/' + str(num) + '.json', 'w') as f:
        #     json.dump(data, f)
        pbar.update(1)

def flip_Horizontal_Vertical(img_path,mask_path,json_path,save_path):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path, "output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)
    # os.makedirs(json_save_path,exist_ok=True)
    # os.makedirs(img_save_path,exist_ok=True)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        num = int(img_name.split('.')[0]) +base_num


        # 打开图片
        img = Image.open(os.path.join(img_path,img_name))
        width, height = img.size
        # 左右翻转
        img = img.transpose(Image.FLIP_TOP_BOTTOM) #Image.Transpose.FLIP_TOP_BOTTOM
        img = img.transpose(Image.FLIP_LEFT_RIGHT)
        img.save(f'{img_save_path}/{num}.jpg')
        #shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')

        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask = mask.transpose(Image.FLIP_TOP_BOTTOM)
        mask = mask.transpose(Image.FLIP_LEFT_RIGHT)
        mask.save(f'{mask_save_path}/{num}.png')

        # with open(f'{json_save_path}/{num}.json', 'r') as f:
        #     data = json.load(f)
        # base64_string = image_to_base64(f'{img_save_path}/{num}.jpg')
        # data["imageData"]= base64_string
        # #data_shapes是一个列表 列表里面包含的元素是字典
        # data_shapes = data['shapes']
        # for label_index,label_points in  enumerate(data_shapes):
        #     points = label_points['points']
        #     for poindt_index,point in enumerate(points):
        #         x,y = point
        #         new_x = (width-x)
        #         new_y = (height-y)
        #         points[poindt_index] = (new_x, new_y)
        # # 将修改后的数据重新写入json文件
        # with open(json_save_path + '/' + str(num) + '.json', 'w') as f:
        #     json.dump(data, f)
        pbar.update(1)

def random_rotate(img_path,mask_path,json_path,save_path):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path, "output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)
    # os.makedirs(json_save_path,exist_ok=True)
    # os.makedirs(img_save_path,exist_ok=True)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        num = int(img_name.split('.')[0]) +base_num

        # 打开图片
        img = Image.open(os.path.join(img_path,img_name))
        width, height = img.size
        # 左右翻转
        angle = 90 if random.random() < 0.5 else 270
        img = img.rotate(angle, expand=True)
        img.save(f'{img_save_path}/{num}.jpg')
        #shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')

        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask = mask.rotate(angle, expand=True)
        mask.save(f'{mask_save_path}/{num}.png')

        # with open(f'{json_save_path}/{num}.json', 'r') as f:
        #     data = json.load(f)
        # base64_string = image_to_base64(f'{img_save_path}/{num}.jpg')
        # data["imageData"]= base64_string
        # #data_shapes是一个列表 列表里面包含的元素是字典
        # data_shapes = data['shapes']
        # for label_index,label_points in  enumerate(data_shapes):
        #     points = label_points['points']
        #     for poindt_index,point in enumerate(points):
        #         x,y = point
        #         new_x = (width-x)
        #         new_y = (height-y)
        #         points[poindt_index] = (new_x, new_y)
        # # 将修改后的数据重新写入json文件
        # with open(json_save_path + '/' + str(num) + '.json', 'w') as f:
        #     json.dump(data, f)
        pbar.update(1)

def randon_contrast_bright(img_path,mask_path,json_path,save_path,min_threshold =0.8,max_threshold=1.12):
    img_save_path = os.path.join(save_path,"output_img")
    json_save_path = os.path.join(save_path,"output_json")
    mask_save_path = os.path.join(save_path, "output_mask")

    base_num = make_dir(img_save_path,mask_save_path,json_save_path)

    img_name_list = os.listdir(img_path)
    img_name_list =sorted(img_name_list,key=lambda x:int(x.split('.')[0]))

    if max_threshold>1.12: max_threshold=1.12
    if min_threshold<0:min_threshold = 0

    pbar = tqdm(total=len(img_name_list))
    for img_name in img_name_list:
        img_weight = random.uniform(min_threshold, max_threshold)

        num = int(img_name.split('.')[0]) +base_num
        img = cv2.imread(os.path.join(img_path,img_name))
        img_geay = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        mean = np.mean(img_geay)

        if mean > 186:
            img_weight = random.uniform(min_threshold, 1)
        elif mean <42:
            img_weight = random.uniform(1, max_threshold)


        if img_weight>0.93 and img_weight<1.07:
            if img_weight <1:
                img_weight -= random.uniform(0, 0.05)
            else:
                img_weight += random.uniform(0, 0.05)

        hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
        bright = hsv_img[:,:,2]

        # 使用矩阵运算加速计算
        bright = bright * img_weight
        bright = np.clip(bright, 0, 255)

        hsv_img[:, :, 2] = bright

        new_img = cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)
        cv2.imwrite(f'{img_save_path}/{num}.jpg',new_img)
        # shutil.copy(f'{json_path}/{num - base_num}.json',f'{json_save_path}/{num}.json')


        mask_name = img_name.split('.')[0] + '.png'
        mask = Image.open(os.path.join(mask_path, mask_name))
        mask.save(f'{mask_save_path}/{num}.png')

        pbar.update(1)

img_path = '/home/netted/img_process_ml/DATA/unet2/VOCdevkit/VOC2007/JPEGImages'
mask_path = '/home/netted/img_process_ml/DATA/unet2/VOCdevkit/VOC2007/SegmentationClass'
json_path = ''
save_path = '/home/netted/img_process_ml/DATA/unet2/VOCdevkit/VOC2007/save'

random_rotate(img_path,mask_path,json_path,save_path)
flip_top_bottom(img_path,mask_path,json_path,save_path)
flip_left_right(img_path,mask_path,json_path,save_path)
flip_Horizontal_Vertical(img_path,mask_path,json_path,save_path)
randon_contrast_bright(img_path,mask_path,json_path,save_path)

没时间优化 凑合着用 哈哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/606179.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RS485空调系统到BACnet江森楼宇系统的高效整合攻略

智慧城市的每一栋建筑都在追求更高的能效与更佳的居住体验&#xff0c;而这一切的实现离不开强大且灵活的楼宇自动化系统。其中&#xff0c;协议转换网关作为连接不同设备的纽带&#xff0c;扮演着至关重要的角色。本文将以一个典型的商业综合体为例&#xff0c;揭秘BACnet协议…

北交所佣金费率标准是多少?北交所相关信息科普

北交所的佣金费率并非固定不变&#xff0c;而是可以根据投资者的需求和证券公司的政策进行调整。目前北交所的佣金费率最低是万分之二。 一般来说&#xff0c;北交所的佣金费率默认在万分之三左右&#xff0c;但这不是固定的费率。根据证券公司的不同&#xff0c;佣金费率可以…

语义分割——前列腺分割数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

微服务学习笔记

微服务学习笔记 文章目录 微服务学习笔记认识微服务微服务技术栈微服务学习要点微服务远程调用1)注册RestTemplate2) 服务远程调用RestTemplate Eureka注册中心简介操作过程搭建EurekaServer注册user-service在order-service完成服务拉取 Ribbon负载均衡IRule负载均衡策略饥饿加…

Electron学习笔记(二)

文章目录 相关笔记笔记说明 三、引入现代前端框架1、配置 webpack&#xff08;1&#xff09;安装 webpack 和 electron-webpack&#xff1a;&#xff08;2&#xff09;自定义入口页面 2、引入 Vue&#xff08;1&#xff09;安装 Vue CLI &#xff08;2&#xff09;调试配置 -- …

【Micropython Pitaya Lite教程】烧录固件

文章目录 前言一、编译固件源码二、烧录固件总结 前言 MicroPython是一种精简的Python 3解释器&#xff0c;可以在微控制器和嵌入式系统上运行。Pitaya Lite是一款基于ESP32的微控制器开发板&#xff0c;它结合了低功耗、Wi-Fi和蓝牙功能。结合MicroPython和Pitaya Lite&#…

Python AI库pandas读写数据库的应用操作——以sqlite3为例

Python AI库pandas读写数据库的应用操作——以sqlite3为例 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 已阅读Pandas基础操作文章,了解pandas常见操作 具备自主扩展学习能力 在数据分析和人工智能领域&#xff0c;pandas库和s…

Ruby中的字符串转换方法

在Ruby中&#xff0c;你可以使用各种方法来转换字符串。下面是一些常用的方法&#xff0c;当然选择哪种适用的方法还得更具具体项目来做调整。日常使用中下面的错误也是比较常见的&#xff0c;看看我们怎么处理哈。 1、问题背景 在Python中&#xff0c;内置的数据结构都有一个…

VMware 虚拟机打开一段时间后卡死,VNX进程CPU占比高

一、问题描述 打开虚拟机后可以正常运行 运行几分钟后突然卡死 然后通过任务管理器可以观察到VMware Workstation VMX应用进程的CPU占比高&#xff0c;CPU也出现异常 关闭虚拟机重新开启&#xff0c;还是一样卡死 二、系统环境 系统: Windows10 VMware: Workstation 17 Pro …

visa/masterCard虚拟信用卡可以用于欧洲亚马逊店Amazon铺吗?欧洲亚马逊Amazon店铺扣租金

亚马逊是网络上最早开始经营电子商务的公司之一&#xff0c;亚马逊成立于1995年&#xff0c;一开始只经营网络的书籍销售业务&#xff0c;现在则扩及了范围相当广的其他产品&#xff0c;已成为全球商品品种最多的网上零售商和全球互联网企业。 很多小伙伴需要开多个站点店铺&a…

软胶囊硬度计:QC部门保障药品质量的精准工具

软胶囊硬度计&#xff1a;QC部门保障药品质量的精准工具 一、引言 随着医药行业的快速发展和药品监管力度的加强&#xff0c;制药企业对于药品质量的要求越来越高。在药品的生产过程中&#xff0c;软胶囊作为一种常见的剂型&#xff0c;其硬度的控制对于药品质量至关重要。软胶…

数组进了多个obj,但是 在修改某个num值时,导致别的num值也发生了变化如何解决?

问题如下&#xff1a; 遇到的问题&#xff0c;数组monthArr1 push进了多个obj,但是 在修改某个num值时&#xff0c;导致别的num值也发生了变化。 而这就是深拷贝浅拷贝的问题。 解决浅拷贝使用深拷贝最简单方法 &#xff1a;JSON.parse(JSON.stringify(obj)) 或者: 使用深拷…

学习Java的日子 Day44 HTML基础

Day44 HTML 学习路线&#xff1a; 前端&#xff1a;展示页面、与用户交互 — HTML 后端&#xff1a;数据的交互和传递 — JavaEE/JavaWeb 1.网页的组成部分(HTMLCSSJavaScript) 前端开发的工作模式&#xff1a;开发输出htmlcssjs HTML&#xff1a;页面结构 CSS&#xff1a;页面…

【linux】——日志分析

1. 日志文件 1.1 日志文件的分类 日志文件&#xff1a; 是用于记录Linux系统中各种运行消息的文件&#xff0c;相当于Linux主机的“日记". 日志文件对于诊断和解决系统中的问题很有帮助&#xff0c;系统一旦出现问题时及时分析日志就会“有据可查”。此外。当主机遭受攻…

JVM的垃圾回收

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机:是指通过软件模拟的具有完整硬件功能、运行在一个完全隔离的环境中完整计算机系统 1.JVM的内存区域划分 jvm是一个java进程 每一个java进程就是一个jvm实例 一个进程运行过程中 就要从操作系…

uniapp0基础编写安卓原生插件之编写安卓页面在uniapp上显示(摄像头调用)

前言 如果你对安卓插件开发部分不熟悉你可以先看uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件 效果 开始 dcloud_uniplugins.json {"nativePlugins": [{"hooksClass": "","plugins": [{&…

软件试运行方案,试运行报告(word原件获取)

一、 试运行目的 &#xff08;一&#xff09; 系统功能、性能与稳定性考核 &#xff08;二&#xff09; 系统在各种环境和工况条件下的工作稳定性和可靠性 &#xff08;三&#xff09; 检验系统实际应用效果和应用功能的完善 &#xff08;四&#xff09; 健全系统运行管理体制&…

Pspice for TI学习

Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…

JavaEE企业级开发中常用的Stream流

介绍 在Java编程中&#xff0c;Stream流是Java 8引入的一个重要概念&#xff0c;它提供了一种新的处理集合的方式&#xff0c;可以更加简洁、高效地进行数据操作。Stream流支持各种常见的操作&#xff0c;比如过滤、映射、排序、聚合等&#xff0c;同时也支持并行处理&#xf…

Vue 项目 尚品汇(二)(暂停进行)

一、Home 模块组件拆分 基本流程 先写静态页面 拆分静态组件 获取服务器的数据进行展示 动态业务 &#xff08;一&#xff09;三级联动组件 如果一个组件在很多模块之间都在使用&#xff0c;我们就拆分成成一个全局组件 只需注册一次 在全局的项目都能使用 三级联动在 …
最新文章