【问题标题】:Return the file name of the list item返回列表项的文件名
【发布时间】:2018-06-19 00:32:48
【问题描述】:

我有一个名为pairs列表pairs = []

pairs 列表中的每一项都是一对图像:

pair = (im1,im2)
pairs.append(pair)

im1im2 只是硬盘上的图像文件:

im1 = cv2.imread('im1.jpg')
im2 = cv2.imread('im2.jpg')

当我打印pairs 列表中的项目时,我得到一个表示元素(图像)的矩阵。如何返回图像文件名(im1.jpgim2.jpg)?

谢谢。

【问题讨论】:

  • 我认为您可能需要使用字典或其他列表并存储文件名
  • 你没有存储字符串,所以你可以创建另一个元组 img=(im1, ‘img1.png) 并存储这些元组对,然后执行 img[1] 来获取文件名
  • 您不能,im1 变量将图像存储为数组。您需要将图像与文件名一起存储。因此,例如您可以执行im1_file = 'im1.jpg'im1 = cv2.imread(im1_file),然后将图像列表存储为字典或对列表等。例如{im1_file: im1, ...}[(im1_file, im1), ...].

标签: python arrays list opencv matrix


【解决方案1】:

opencv 库的imread() 函数返回一个numpy 数组。所以你不能真正从中访问文件名。我会尝试这样的事情:

class Image(object):
    def __init__(self, image_name):
        self.image_name = cv2.imread(image_name)
        self.name = image_name

    def __str__(self):
        return self.name

创建您的图像:

im1 = Image('im1.jpg')
im2 = Image('im2.jpg')

(im1, im2) 对附加到您的pairs 列表中。然后,当您打印对列表中的项目时,只需确保打印它们的__str__ 表示:

for p in pairs:
    print (str(p[0]), str(p[1])) 

【讨论】:

  • 如果你在你的类上同时定义了 __str__()__repr__(),你就不需要显式地转换成字符串了。
【解决方案2】:

您无法从数组中获取文件名。变量im1 = cv2.imread(...)only 存储数组值。它存储为标准 numpy ndarray 对象,并且没有引用文件名的属性。

然而,这里有很多选项可以做你想做的事,其中一些是 Python 的典型模式。通常,您希望存储两条信息:文件名和图像数组。一种选择是有两个列表,一个是文件名,另一个是图像:

>>> filename_list = ['im1.jpg', 'im2.jpg', ...]
>>> im_list = [cv2.imread(filename) for filename in filename_list]

另一种方法是将它们成对存储:

>>> filename1 = 'im1.jpg'
>>> filename2 = 'im2.jpg'
>>> im1 = cv2.imread(filename1)
>>> im2 = cv2.imread(filename2)
>>> im_pairs = [(filename1, im1), (filename2, im2), ...]

或者如果您已经将文件名和图像作为列表(如第一种情况),您可以使用列表推导来构建对:

>>> im_pairs = [(filename, im) for filename, im in zip(filename_list, im_list)]

一个更好的选择(就实际项目中的代码重用而言)与上述相同的想法是创建一个namedtuple,以便更明确每个项目是什么:

>>> from collections import namedtuple
>>> Img = namedtuple('Img', ['name', 'data'])
>>> im1 = Img('im1.jpg', np.array([5, 4, 3, 2, 1]))
>>> im1.name
'im1.jpg'
>>> im1.data
array([5, 4, 3, 2, 1])

您可以在这里创建Img 对象列表。

第四个选项是使用 Python 字典,键是名称,值是数组:

>>> filename1 = 'im1.jpg'
>>> filename2 = 'im2.jpg'
>>> im1 = cv2.imread(filename1)
>>> im2 = cv2.imread(filename2)
>>> im_pairs = {filename1: im1, filename2: im2, ...}

或再次使用字典理解:

>>> im_pairs = {filename: im for filename, im in zip(filename_list, im_list)}

所有这些方法都是相当标准的,因此您可以自行决定如何使用它们。还有很多其他方法,但我认为以上是最常见的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多