前言
网上的包,写着写着,就不耐烦了,还是自己写吧
注释掉的部分 是对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)
没时间优化 凑合着用 哈哈哈