使用从 txt 文件中提取的尺寸裁剪图像

Posted

技术标签:

【中文标题】使用从 txt 文件中提取的尺寸裁剪图像【英文标题】:Crop images using dimensions extracted from txt file 【发布时间】:2016-07-27 22:26:54 【问题描述】:

我想使用 PIL 或 opencv2 在我的文件夹中裁剪多个图像。但是,我在一个与图像具有相同文件名的文本文件中有尺寸。 所以,假设我的文件名是 1_a.jpg,尺寸(左上角.x,宽度;左上角.x,高度)在 1_a.txt 文件中。 因此,我的程序必须遍历每个文件,选择尺寸并裁剪图像。 我正在使用类似的设置,我尝试将所有维度分别附加到列表中,然后尝试在裁剪时迭代指向列表的图像,但是它不起作用。 请帮忙。

在下面找到我的代码:-

for f in glob.glob(os.path.join(faces_folder_path, "*.txt")):
    file = open(f)
    small=[]
    data= file.read()

    print type(data)
    small.append(data.rstrip('\n'))
    print small
    print small[1]
    print type(small)
    x.append(small)
    print type(x)
    print x

    # print type(list)
    # print list
    # # print x
    # x.append(list)
    # for i,val in enumerate(x):
    #     print val[0]



for f in glob.glob(os.path.join(faces_folder_path, "*.png")):

    imgfile = f[53:75]
    print imgfile
    img=cv2.imread(imgfile)
    cv2.imshow('image',img)
    print (x[i])
    print type(x[i])
    # new_image=img[x[i]]
    # cv2.imshow('cropped',new_image)

    # cv2.imsave('imgfile',new_image)

    i+=1
    cv2.waitKey(0)

【问题讨论】:

我认为您假设两个 glob 调用将以相同的顺序返回 *.txt 和 *.png 文件,但这不一定是真的。有两件事可能会有所帮助:(1) 在循环 *.txt 期间,将数据存储在以 f[-4](文件名减去 '.txt')为键的字典中,例如 d[f[ -4]]=小。然后在循环 *.png 期间,通过访问 d[f[-4]] 检索数据。 (2) 跳过 *.txt 文件的循环,并在循环 *.png 文件时读取 .txt 文件。你可以用类似f_text = open(f[-4]+'.txt') 谢谢!这有帮助! 【参考方案1】:

您最好只循环浏览所有 PNG 文件,并为每一个尝试查找匹配的文本文件,如下所示:

import glob
import os
import re

faces_folder_path = r"c:\myfiles"

for png_file in glob.glob(os.path.join(faces_folder_path, "*.png")):
    name, ext = os.path.splitext(os.path.basename(png_file))

    try:
        with open(os.path.join(faces_folder_path, '.txt'.format(name))) as f_text:
            re_crop = re.search(r'(\d+),(\d+);(\d+),(\d+)', f_text.read())

            if re_crop:
                x, width, y, height = [int(v) for v in re_crop.groups()]

                # Add crop code here
            else: 
                print '"" text file format not understood'.format(png_file)
    except IOError as e:
        print '"" has no matching txt file'.format(png_file)

这将获取每个 png 文件的文件路径并提取基本文件名。然后它构建一个匹配的 txt 文件,将其加载并使用正则表达式来尝试查找所需的作物详细信息。每个条目都转换为int

假设示例文本文件如下所示:

0,100;10,50

【讨论】:

以上是关于使用从 txt 文件中提取的尺寸裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中裁剪具有尺寸(没有质量损失)的图像?

使用 java image.getSubimage 裁剪图像的问题

如何使用 jcrop 裁剪不同尺寸的图像

RMagick 无法裁剪裁剪的图像?

从中心 PHP 裁剪图像

裁剪图像而不加载到内存中