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 = '0' elif name == 'double': name = '1' 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, os.path.splitext(filename)[0], name, sx1,sy1,sx2,sy2, 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 = 'D:\p\cw\C06center' if not os.path.isdir(image_dir): print('无效的图片文件夹路径') exit(1) #coord_dir = input('请输入坐标文件夹路径:').strip() coord_dir = 'D:\p\cw\C06center_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 = 'D:\p\cw\C06center_out'

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):
            i = str(i + 1).zfill(3)
            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, i))
            capture_image(img_path, coord, var, save_start, filename, method
Python 脚本优化:图片命名添加识别信息,实现图片裁剪

原文地址: http://www.cveoy.top/t/topic/oawN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录