【问题标题】:Combining multiple images, in many folders in Python在 Python 中的多个文件夹中组合多个图像
【发布时间】:2020-07-14 09:04:41
【问题描述】:

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

  • file_123_A.ome.tif
  • file_123_B.ome.tif
  • file_123_C.ome.tif
  • file_125_A.ome.tif
  • file_125_B.ome.tif
  • file_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 对我的文件名来说是唯一的,但它确实有效。

【问题讨论】:

  • 你的意思是你的脚本应该递归通过一大堆加入图像的目录,或者它应该在一个目录中处理所有图像,或者你应该将参数 file_XXX 传递给它应该只加入以该前缀开头的当前目录中的图像吗?我想我在问你想用什么参数来调用脚本?
  • 感谢您的回复。我需要在一个文件夹中找到所有具有相同 XXX 的图像,并将这些图像的 A、B、C 版本连接在一起。由于 file_XXX 中的文件在每个子目录中发生更改,因此对子目录执行此操作可能会变得复杂。这有意义吗?
  • 尝试使用glob() 获取所有 TIFF 的列表。然后在第二个下划线之后删除每个文件名中的所有内容并将结果添加到一个集合中 - 然后您将拥有一组唯一的文件名前缀。然后您可以遍历这些文件,添加 A/B/C 后缀并合并文件。
  • 我想我理解你的方法。我会去感谢您的回复。
  • 试一试。单击您的问题下方的edit,然后粘贴您正在工作的任何代码并说出您遇到的问题。

标签: python-3.x image numpy-ndarray


【解决方案1】:

这应该对当前目录中的所有文件组执行您想要的操作。我会让你添加错误处理和其他小变化:

#!/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)
    

【讨论】:

  • 这太棒了,非常感谢马克,对特定目录进行了一些编辑,我已经成功了。更好的是,我实际上可以看看这个,看看它主要在做什么。我需要检查和阅读一些内容。
  • 酷 - 祝你的项目好运。如果您遇到困难,请回来提出新问题 - 问题(和答案)是免费的 :-)
猜你喜欢
  • 2020-08-24
  • 2017-02-22
  • 2018-09-07
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多