返回列表项的文件名

时间:2018-01-09 21:57:38

标签: python arrays list opencv matrix

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

pairs列表中的每个项目都是一对图片:

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

您无法从阵列中获取文件名。变量im1 = cv2.imread(...) 存储数组值。它存储为标准的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)}

所有这些方法都非常标准,因此您可以根据自己的需要使用它们。还有很多其他的方法,但我认为以上是最常见的。

答案 1 :(得分:0)

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]))