如何裁剪多图像使用文件中的列表边界框位置(python)?
Posted
技术标签:
【中文标题】如何裁剪多图像使用文件中的列表边界框位置(python)?【英文标题】:How to crop multi images use list bounding box position in the file (python)? 【发布时间】:2019-09-26 07:30:38 【问题描述】:我有一个 images.jpg 数据集和一个 csv 文件的值,边界框位置是顶部、左侧、右侧、底部。我使用 ubuntu 操作系统和 python 语言。
【问题讨论】:
图片的高度和宽度的值是多少? 您的意思是每个图像文件都有单独的文件和裁剪位置吗?或者您有一个文件,其中包含数百个裁剪位置,您必须以某种方式找到哪个位置用于哪个图像?你的文件格式是什么?你有多少个文件?你使用什么操作系统?请添加您尝试过的代码。 我编辑了我的帖子 看看能不能先写一些Python来解析CSV文件,读一行,提取图片文件名和左、右、上、下值并打印出来。然后将其添加到您的问题中,您将完成最困难的部分。 顺便说一句,请不要发布您的数据图片 - 它们很难解析!而是发布实际数据。 【参考方案1】:这样的事情应该可以工作。它假设了一些事情:
CSV 中的分隔符是分号,即;
您的 CSV 文件名为 images.csv
您希望将裁剪后的图像输出到名为output
的子目录中
您已经安装了 PIL/Pillow,尽管它可以很容易地适应使用 pyvips
、OpenCV
、skimage
#!/usr/bin/env python3
import os
import re
import csv
import json
from PIL import Image
def cropImage(filename,coords):
"""Crop image specified by filename to coordinates specified."""
print(f"DEBUG: cropImage(filename,coords)")
# Open image and get height and width
im = Image.open(filename)
w, h = im.width, im.height
# Work out crop coordinates, top, left, bottom, right
l = int(coords['left'] * w)
r = int(coords['right'] * w)
t = int(coords['top'] * h)
b = int(coords['bottom']* h)
# Crop and save
im = im.crop((l,t,r,b))
im.save("output/" + filename)
return
# Create output directory if not existing
if not os.path.exists('output'):
os.makedirs('output')
# Process CSV file - expected format
# heading;heading
# 00000001.jpg?sr.dw=700;'right': 0.9, 'bottom': 0.8, 'top': 0.1, 'left': 0.2
# 00000002.jpg?sr.dw=700;'right': 0.96, 'bottom': 0.86, 'top': 0.2, 'left': 0.25
with open('images.csv') as csvfile:
csv_reader = csv.reader(csvfile, delimiter=';')
for row in csv_reader:
fieldA, fieldB = row[:2]
# Ignore header lines
if not "jpg" in fieldA:
continue
# Strip trailing rubbish off filename
filename = re.sub("\?.*","",fieldA)
print(f"DEBUG: filename=filename")
# Replace single quotes in JSON with double quotes
JSON = fieldB.replace("'",'"')
print(f"DEBUG: JSON=JSON")
coords = json.loads(JSON)
print(f"DEBUG: coords=coords")
cropImage(filename, coords)
【讨论】:
感谢您对我的帮助 不客气。如果可行,请记住接受为正确答案 - 如果可行,请单击投票计数旁边的空心勾✅。谢谢你,祝你好运!以上是关于如何裁剪多图像使用文件中的列表边界框位置(python)?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Ghostscript 裁剪 pdf(无需手动输入边界框)