Python代码优化:根据坐标文件内容修改图片命名
import os
import json
import xml.etree.ElementTree as ET
from PIL import Image
import cv2
def read_coordinates(filepath, file_type):
'''
根据文件类型读取坐标信息
'''
if file_type == 'json':
with open(filepath, 'r') as f:
data = json.load(f)
if 'coordinates' in data:
return data['coordinates']
elif file_type == 'xml':
root = ET.parse(filepath).getroot()
coord_list = []
for obj in root.iter('object'):
coords = obj.find('bndbox')
name = obj.find('name').text
if name == 'plate':
name = '_01'
elif name == 'double':
name = '_02'
else:
name = ''
if name:
coord_list.append([
int(coords.find('xmin').text),
int(coords.find('ymin').text),
int(coords.find('xmax').text),
int(coords.find('ymax').text),
name
])
return coord_list
elif file_type == 'txt':
with open(filepath, 'r') as f:
coords = f.readline().strip()
coords = [int(coord) for coord in coords.split(',')[:-1]]
return coords
else:
raise ValueError('Unknown file type')
return None
def capture_image(image_path, coords, var, save_start, filename, method='cv2'):
'''
实现根据坐标截取图像
'''
if method == 'cv2':
img = cv2.imread(image_path)
xmin, ymin, xmax, ymax, name = coords
xmin = max(0, xmin - var)
ymin = max(0, ymin - var)
xmax = min(img.shape[1], xmax + var)
ymax = min(img.shape[0], ymax + var)
img = img[ymin:ymax, xmin:xmax]
x1,y1,x2,y2 = coords[:4]
sx1 = x1 - xmin
sx2 = x2 - xmin
sy1 = y1 - ymin
sy2 = y2 - ymin
save_path = '{}_{}_{}_{}_{}{}.{}'.format(
save_start, sx1,sy1,sx2,sy2, name, filename.split('.')[-1])
cv2.imwrite(save_path, img)
print('保存截图:', save_path)
elif method == 'PIL':
img = Image.open(image_path)
xmin, ymin, xmax, ymax, name = coords
xmin = max(0, xmin - var)
ymin = max(0, ymin - var)
xmax = min(img.width, xmax + var)
ymax = min(img.height, ymax + var)
img = img.crop((xmin, ymin, xmax, ymax))
# img.save(save_path)
if __name__ == '__main__':
#image_dir = input('请输入图片文件夹路径:').strip()
image_dir = 'F:\park\C06right'
if not os.path.isdir(image_dir):
print('无效的图片文件夹路径')
exit(1)
#coord_dir = input('请输入坐标文件夹路径:').strip()
coord_dir = 'F:\park\C06right_xml'
if not os.path.isdir(coord_dir):
print('无效的坐标文件夹路径')
exit(1)
#var = int(input('请输入扩展截图范围的变量(默认为10):').strip() or '10')
var = 150
#method = input('请选择截图工具(1:opencv,2:PIL,默认为opencv):').strip()
#method = 'cv2' if method != '2' else 'PIL'
method = 'cv2'
#save_dir = input('请输入保存截图的文件夹路径:').strip()
save_dir = 'F:\park\C06right_cut'
if not os.path.isdir(save_dir):
print('无效的保存文件夹路径')
exit(1)
for filename in os.listdir(image_dir):
if filename.endswith(('jpg', 'jpeg', 'png', 'JPG', 'JPEG', 'PNG')):
basename = os.path.splitext(filename)[0]
coord_path = os.path.join(coord_dir, basename + '.xml')
if not os.path.isfile(coord_path):
coord_path = os.path.join(coord_dir, basename + '.json')
if not os.path.isfile(coord_path):
coord_path = os.path.join(coord_dir, basename + '.txt')
if not os.path.isfile(coord_path):
continue
coords = read_coordinates(coord_path, os.path.splitext(coord_path)[-1][1:])
if coords is None:
continue
print(coords)
img_path = os.path.join(image_dir, filename)
for i, coord in enumerate(coords):
xmin, ymin, xmax, ymax = coord[:4]
img_h, img_w, _ = cv2.imread(img_path).shape
rel_xmin = (xmin - var)
rel_ymin = (ymin - var)
rel_xmax = (xmax + var)
rel_ymax = (ymax + var)
save_start = os.path.join(save_dir, '{}_{}'.format(basename, coord[4]))
capture_image(img_path, coord, var, save_start, filename, method)
原文地址: http://www.cveoy.top/t/topic/oavW 著作权归作者所有。请勿转载和采集!