Объединение нескольких изображений во многих папках в Python - PullRequest
1 голос
/ 14 июля 2020

У меня есть папка с изображениями в градациях серого (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 установить в свои индивидуальные массивы. Однако как только я это сделаю, я больше не могу проверять имена файлов и то, что изображения находятся в том же порядке, поэтому, если изображение 0 в массиве A является правильным связанным изображением в массивах B и C. Я могу это сделать, и он успешно работает, но я не уверен, что это лучшее решение.

Поскольку номер каждого изображения уникален, я хочу закодировать решение, которое читается в именах файлов и проверяет что три изображения имеют одинаковый уникальный номер и представляют собой набор, например A, B, C изображений, а затем объединяет их соответствующим образом. Я борюсь с этим, если бы кто-то мог указать мне в правильном направлении, что было бы здорово.

Не уверен, насколько хорошо я это объяснил, поэтому, если вам нужны разъяснения, спросите.

Спасибо

Обновление:

Этот код (см. Ниже) дает мне набор уникальных имен файлов в каталоге и подкаталоге. Возможно, это не самый эффективный вариант, но он работает. Сейчас я пытаюсь использовать этот l oop поверх фактических файлов изображений, чтобы сравнить и объединить или объединить три изображения с каждым уникальным идентификатором.

#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 уникален к моим именам файлов, но он работает.

1 Ответ

0 голосов
/ 15 июля 2020

Это должно делать то, что вы хотите, со всеми группами файлов в текущем каталоге. Я оставлю вас, чтобы добавить обработку ошибок и другие небольшие вариации:

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