Python 3.x 在Python的多个文件夹中组合多个图像

Python 3.x 在Python的多个文件夹中组合多个图像,python-3.x,image,numpy-ndarray,Python 3.x,Image,Numpy Ndarray,我有一个灰度图像文件夹(100x100像素),文件名如下: 文件_123_A.ome.tif 文件_123_B.ome.tif 文件_123_C.ome.tif 文件_125_A.ome.tif 文件_125_B.ome.tif 文件_125_C.ome.tif 每个文件名的编号(在我上面的示例中为123和125)链接图像,因此这些图像集是相关的 我正在尝试将文件读入一个numpy数组,然后将三个相关的图像组合成一个100x100x3或100x300的新图像 我可以愉快地将A集合中的图像读入

我有一个灰度图像文件夹(100x100像素),文件名如下:

  • 文件_123_A.ome.tif
  • 文件_123_B.ome.tif
  • 文件_123_C.ome.tif
  • 文件_125_A.ome.tif
  • 文件_125_B.ome.tif
  • 文件_125_C.ome.tif
每个文件名的编号(在我上面的示例中为123和125)链接图像,因此这些图像集是相关的

我正在尝试将文件读入一个numpy数组,然后将三个相关的图像组合成一个100x100x3或100x300的新图像

我可以愉快地将A集合中的图像读入一个数组,然后将B和C集合中的图像读入各自的数组。但是,一旦我这样做了,我就不能再检查文件名和图像的顺序是否相同,因此如果A数组中的图像0是B和C数组中正确的相关图像。我可以做到这一点,并已成功地让它工作,但我不确定这是最好的解决方案

由于每个图像的编号都是唯一的,因此我想编写一个解决方案,读取文件名并检查三个图像是否具有相同的唯一编号,是否为一组图像,例如a、B、C图像,然后将它们相应地组合在一起。如果有人能给我指出正确的方向,那将是非常棒的

不知道我解释得有多好,所以如果您需要澄清,请询问

谢谢

更新:

这段代码(见下文)在一个目录和子目录中为我获取一组唯一的文件名。它可能不是最有效的,但它确实有效。我现在正在努力解决的是,在实际图像文件上使用这个循环,进行比较,合并或连接具有每个唯一ID的三个图像

#Set directory to look in
file = glob.glob(r'my_directory\**\*.tif',recursive = True)

#Loop though the files and put all the uniques files name into a list
fname_lst = []
for img in file:
    i = img.split('\\')[5][:-12]
    fname_lst.append(i)
fname_lst = set(fname_lst)

显然.split对于我的文件名是唯一的,但它确实有效。

这应该可以满足您对当前目录中所有文件组的要求。我将让您添加错误处理和其他小变化:

#!/usr/bin/env python3

import cv2
from glob import glob

# Get list of files matching "*A.ome.tif"
files = glob("*A.ome.tif")

# Get list of unique stems
stems = [f.replace('A.ome.tif', '') for f in files]

# Iterate over unique stems
for stem in stems:
    A = cv2.imread(stem + 'A.ome.tif')
    B = cv2.imread(stem + 'B.ome.tif')
    C = cv2.imread(stem + 'C.ome.tif')
    # Stack images horizontally (side-by-side), use np.dstack() for merging channels
    result = np.hstack((A,B,C))
    cv2.imwrite(stem + 'result.tif', result)
    

这应该可以满足您对当前目录中所有文件组的要求。我将让您添加错误处理和其他小变化:

#!/usr/bin/env python3

import cv2
from glob import glob

# Get list of files matching "*A.ome.tif"
files = glob("*A.ome.tif")

# Get list of unique stems
stems = [f.replace('A.ome.tif', '') for f in files]

# Iterate over unique stems
for stem in stems:
    A = cv2.imread(stem + 'A.ome.tif')
    B = cv2.imread(stem + 'B.ome.tif')
    C = cv2.imread(stem + 'C.ome.tif')
    # Stack images horizontally (side-by-side), use np.dstack() for merging channels
    result = np.hstack((A,B,C))
    cv2.imwrite(stem + 'result.tif', result)
    

你的意思是说你的脚本应该在连接图像的整个目录中递归,或者它应该在一个目录中执行所有图像,或者你应该向它传递参数
file_XXX
,它应该只连接当前目录中以该前缀开头的图像?我想我是在问你想用什么参数调用脚本?谢谢你的回答。我需要找到文件夹中所有具有相同XXX的图像,并将这些图像的a、B、C版本连接在一起。对子目录执行此操作可能会变得复杂,因为每个子目录中的文件_XXX中的文件都会发生更改。这有意义吗?尝试使用
glob()
获取所有TIFF的列表。然后删除每个文件名中第二个下划线后的所有内容,并将结果添加到一个集合中,这样您将拥有一组唯一的文件名前缀。然后你可以重复这些,添加
A/B/C
后缀并合并文件。我想我理解你的方法。我要试一试谢谢你的回复。试试看。单击问题下方的
edit
,然后粘贴任何你开始工作的代码,并说出你被卡住的地方。你的意思是你的脚本应该在连接图像的整个目录中递归,或者它应该在一个目录中处理所有图像,或者您应该向它传递参数
file_XXX
,并且它应该只连接当前目录中以该前缀开头的图像?我想我是在问你想用什么参数调用脚本?谢谢你的回答。我需要找到文件夹中所有具有相同XXX的图像,并将这些图像的a、B、C版本连接在一起。对子目录执行此操作可能会变得复杂,因为每个子目录中的文件_XXX中的文件都会发生更改。这有意义吗?尝试使用
glob()
获取所有TIFF的列表。然后删除每个文件名中第二个下划线后的所有内容,并将结果添加到一个集合中,这样您将拥有一组唯一的文件名前缀。然后你可以重复这些,添加
A/B/C
后缀并合并文件。我想我理解你的方法。我要试一试谢谢你的回复。试试看。单击问题下方的
edit
,然后粘贴任何你开始工作的代码,并说出你被卡住的地方。这太棒了。非常感谢马克,只需对特定目录进行一点编辑,我就可以工作了。更好的是,我可以看看这个,看看它主要在做什么。有几点我需要检查和阅读。酷-祝你的项目好运。如果你被卡住了,回来问一个新问题-问题(和答案)是免费的:-)太棒了,非常感谢你,马克,对特定目录进行了一些编辑,我已经开始工作了。更好的是,我可以看看这个,看看它主要在做什么。有几点我需要检查和阅读。酷-祝你的项目好运。如果你陷入困境,回来问一个新问题-问题(和答案)是免费的:-)