Сохранение .tif стека с помощью PIL / Image - PullRequest
2 голосов
/ 21 октября 2019

У меня есть куча изображений .tif в каталоге, и я пытаюсь открыть их, используя PIL, и сохраняю их как один файл .tif, где каждое изображение представляет собой фрейм. Что в принципе должно быть возможно в соответствии с этим: https://github.com/python-pillow/Pillow/issues/3636#issuecomment-508058396

Пока я получил:

from PIL import Image

img_frames = ['test_imgs/img1.tif',
            'test_imgs/img2.tif',
            'test_imgs/img3.tif']

# read the images and store them in a list
ordered_image_files = []
for img in img_frames:
    with Image.open(img) as temp_img:
        ordered_image_files.append(temp_img)

# save the first image and add the rest as frames
ordered_image_files[0].save('test.tif', 
                            save_all = True, 
                            append_images = ordered_image_files[1:])

Запуск этого дает мне:

AttributeError: 'TiffImageFile' object has no attribute 'load_read'

Если я печатаюобъекты изображения и их классы, которые я получаю:

> print(ordered_image_files[0])
<PIL.TiffImagePlugin.TiffImageFile image mode=I;16B size=512x512 at 0x1028C6550>
> print(type(ordered_image_files[0]))
<class 'PIL.TiffImagePlugin.TiffImageFile'>

Так что я думаю, что с чтением все в порядке.

Я новичок в обработке изображений, поэтому, возможно, я упускаю что-то очевидное.

Заранее спасибо.

Полная трассировка ошибок:

Traceback (most recent call last):
  File "/Users/mpages/miniconda3/envs/denoise_n2v/lib/python3.6/site-packages/PIL/ImageFile.py", line 161, in load
    read = self.load_read
AttributeError: 'TiffImageFile' object has no attribute 'load_read'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "img_test.py", line 24, in <module>
    append_images = ordered_image_files[1:])
  File "/Users/mpages/miniconda3/envs/denoise_n2v/lib/python3.6/site-packages/PIL/Image.py", line 2050, in save
    self._ensure_mutable()
  File "/Users/mpages/miniconda3/envs/denoise_n2v/lib/python3.6/site-packages/PIL/Image.py", line 640, in _ensure_mutable
    self._copy()
  File "/Users/mpages/miniconda3/envs/denoise_n2v/lib/python3.6/site-packages/PIL/Image.py", line 633, in _copy
    self.load()
  File "/Users/mpages/miniconda3/envs/denoise_n2v/lib/python3.6/site-packages/PIL/TiffImagePlugin.py", line 1098, in load
    return super(TiffImageFile, self).load()
  File "/Users/mpages/miniconda3/envs/denoise_n2v/lib/python3.6/site-packages/PIL/ImageFile.py", line 165, in load
    read = self.fp.read
AttributeError: 'NoneType' object has no attribute 'read'

1 Ответ

1 голос
/ 21 октября 2019

Я полагаю, что ваше утверждение with закрывает файл изображения или выводит его из некоторого контекста памяти, к которому он может быть получен, так что вы можете попробовать это, что прекрасно работает на моем Mac:

for img in img_frames: 
    ordered_image_files.append(Image.open(img)) 

В противном случае у меня был некоторый успех с модулем tifffile, следующим образом:

import tifffile
img_frames = [ '1.tif', '2.tif', '3.tif' ]

with tifffile.TiffWriter('multipage.tif') as stack: 
    for filename in img_frames: 
        stack.save(tifffile.imread(filename))

Ключевые слова : Python, TIF, TIFF, tifffile, многостраничный,многостраничность, последовательность, изображение, обработка изображений

...