在TIFF文件中写入附件图像而不删除现有图像

时间:2019-04-29 08:27:48

标签: python image tiff python-imageio

我实际上是在使用imageio.mimwrite()将图像保存到tiff文件中。但是在脚本中,我多次打开和关闭文件,因此在保存新闻图像之前,它会擦除​​现有图像。我想将现有图像保留在tiff文件中,而只添加新图像而不删除以前的图像。我在文档中找不到任何可以帮助我的东西。

我实际上正在使用这个: imageio.mimwrite("example.tiff", image, format=".tiff")

image是一个包含整数数组的数组,每个数组代表一幅图像。

此代码将打开example.tiff,删除现有图像(如果存在)并编写新闻图像。但我想像open("file.txt", "a")一样添加。

2 个答案:

答案 0 :(得分:1)

我使用 ImageMagick 制作了三幅不同尺寸的TIFF图像,以进行测试:

convert -size 640x480  xc:green             green.tif
convert -size 1024x768 xc:blue              blue.tif
convert -size 400x100 gradient:cyan-yellow  gradient.tif

然后,我使用随TIFF库一起分发的工具tiffcp-a选项,将蓝色和渐变图像附加到绿色图像上,如下所示:

tiffcp -a blue.tif gradient.tif green.tif

如果我随后用 ImageMagick green.tiff检查identify的内容,我认为它是正确的:

magick identify green.tif
green.tif[0] TIFF 640x480 640x480+0+0 16-bit sRGB 6.49355MiB 0.000u 0:00.000
green.tif[1] TIFF 1024x768 1024x768+0+0 16-bit sRGB 0.000u 0:00.000
green.tif[1] TIFF 400x100 400x100+0+0 16-bit sRGB 0.000u 0:00.000

如果我预览文件,则所有三张图像都具有正确的大小和颜色:

enter image description here

因此,我建议您考虑使用subprocess.run()来封装tiffcp

答案 1 :(得分:0)

使用tifffile一次写入一页(在本例中为CTYX多页),如果您有足够的RAM来使用tifffile.imwrite(filename,array),则可以直接从n-D数组直接写入。 https://pypi.org/project/tifffile/

import tifffile as tf
with tf.TiffWriter("filenametest.tiff",
                    #bigtiff=True,
                    #If you want to add on top of an existing tiff file (slower) uncomment below
                    #append = True,
                    imagej=False,) as tif:
    for time in range(rgb.shape[1]):
         tif.save(rgb[:,time,:,:].,
                #compress= 3,
                photometric='minisblack',
                metadata= None,
                contiguous=False,
            )
tif.close()

使用python-bioformats:

https://pythonhosted.org/python-bioformats/

bioformats.write_image(pathname, pixels, pixel_type, c=0, z=0, t=0, size_c=1, size_z=1, size_t=1, channel_names=None)[source]

如果有:

  • 4个时间点与

  • 3个彩色zstacks(11个Z)

  • ,XY为1024像素。 独立的numpy数组为[3,11,1024,1024](每个时间点一个),

  • 16位, 并命名为:a,b,c,d。

这应该可以解决问题

import bioformats as bf
import numpy as np

#do something here to load a,b,c, and d

i=0
for t in [a,b,c,d]:
    for c in range(3):
        for z in range(11):
            #t here is the numpy array
            bf.write_image('/path/to/file.tiff' 
            , t
            , bf.PT_UINT16
            , c = c, z = z , t = i, size_c= 3, size_z=11, size_t=4
            )
    i+=1