我有一个名为pairs
的列表:pairs = []
pairs
列表中的每个项目都是一对图片:
pair = (im1,im2)
pairs.append(pair)
im1
和im2
只是硬盘上的图像文件:
im1 = cv2.imread('im1.jpg')
im2 = cv2.imread('im2.jpg')
当我打印pairs
列表中的项目时,我得到一个表示元素(图像)的矩阵。如何返回图像文件名(im1.jpg
和im2.jpg
)?
感谢。
答案 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]))