如果名称图像与Python的csv文件中的image_id相匹配,则从文件夹中裁剪多张图像

问题描述 投票:0回答:2

我在csv文件中获得了大约300个image_id和边框框位置的列表。我还有一个约300张图像的文件夹,每个图像ID与每个图像的名称匹配。如果图像名称和image_id相匹配,我该如何比较它的名称,我将对其进行裁剪。

我使用python语言和ubuntu操作系统。

我在文件夹中的图像名称:

1693884003.jpg
1693884030.jpg
1735837028.jpg
1740301012.jpg
1779624112.jpg

我的csv文件中的数据:

image_id    bounding_box
1693884003  {'right': 0.6428571428571429, 'bottom': 0.9761904761904762, 'top': 0.38095238095238093, 'left': 0.22857142857142856}
1693884030  {'right': 0.6571428571428571, 'bottom': 0.9285714285714286, 'top': 0.38095238095238093, 'left': 0.3142857142857143}
1735837028  {'right': 0.68, 'bottom': 0.9, 'top': 0.4, 'left': 0.34}
1740301012  {'right': 0.6142857142857143, 'bottom': 0.9523809523809523, 'top': 0.38095238095238093, 'left': 0.35714285714285715}
1779624112  {'right': 0.7142857142857143, 'bottom': 0.9047619047619048, 'top': 0.5357142857142857, 'left': 0.21428571428571427}
python csv image-processing artificial-intelligence bounding-box
2个回答
0
投票
import os, pandas

data = pandas.read_csv(your_csv_file) #read csv file

# Get the directory of images
path = "path folder"

#Edit2 you may have to add dtype str, as pandas will assume int if you only have integers
dirs = os.listdir( path, dtype=str ) #get all files in folder

# Get all the files and split at '.' to get the names
listoffiles = []
for file in dirs:
    basename = os.path.splitext(file)[0] #this will get you the basename 
    listoffiles.append(basename)         #you will have a list of all filenames

matches = data[data['image_id'].isin(listoffiles)] #now in matches you have a table containing only rows that correspond to filenames
print(matches.head()) 

希望这会有所帮助。

编辑:您可以稍后重复匹配以实际进行裁剪:

for index, row in matches.iterrows():
     print(row['image_id'], row['bounding_box'])
     # do cropping here

0
投票

我认为您可以以json.loads方法为基础

json.loads

[请注意,当您从打开的文件中读取内容时,我是从字符串中读取的,另请注意,In [23]: from json import loads ...: ...: data = '''\ ...: 1693884003 {'right': 0.6428571428571429, 'bottom': 0.9761904761904762, 'top': 0.38095238095238093, 'left': 0.22857142857142856} ...: 1693884030 {'right': 0.6571428571428571, 'bottom': 0.9285714285714286, 'top': 0.38095238095238093, 'left': 0.3142857142857143} ...: 1735837028 {'right': 0.68, 'bottom': 0.9, 'top': 0.4, 'left': 0.34} ...: 1740301012 {'right': 0.6142857142857143, 'bottom': 0.9523809523809523, 'top': 0.38095238095238093, 'left': 0.35714285714285715} ...: 1779624112 {'right': 0.7142857142857143, 'bottom': 0.9047619047619048, 'top': 0.5357142857142857, 'left': 0.21428571428571427}\ ...: ''' ...: images = {} ...: for line in data.splitlines(): ...: image, bounds = line.split(' ', 1) ...: images[image] = loads(bounds.replace("'", '"')) ...: from pprint import pprint ...: pprint(images) {'1693884003': {'bottom': 0.9761904761904762, 'left': 0.22857142857142856, 'right': 0.6428571428571429, 'top': 0.38095238095238093}, '1693884030': {'bottom': 0.9285714285714286, 'left': 0.3142857142857143, 'right': 0.6571428571428571, 'top': 0.38095238095238093}, '1735837028': {'bottom': 0.9, 'left': 0.34, 'right': 0.68, 'top': 0.4}, '1740301012': {'bottom': 0.9523809523809523, 'left': 0.35714285714285715, 'right': 0.6142857142857143, 'top': 0.38095238095238093}, '1779624112': {'bottom': 0.9047619047619048, 'left': 0.21428571428571427, 'right': 0.7142857142857143, 'top': 0.5357142857142857}} In [24]: 仅期望双引号作为分隔符,因此在使用json.loads之前,我们必须使用双引号将replace用单引号引起来。

© www.soinside.com 2019 - 2024. All rights reserved.