如何裁剪多图像使用文件中的列表边界框位置(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,尽管它可以很容易地适应使用 pyvipsOpenCVskimage
#!/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(无需手动输入边界框)

如何在每一行上绘制单个边界框,裁剪边界框并将图像保存在文件夹 opencv python

模型训练 - 对象的裁剪图像 VS 带有边界框的更大图像

如何使用边界框裁剪图像

旋转图片中的 ROI

如何将 .OBJ 3D 模型自动裁剪为边界框?