Python PIL For循环使用多图像TIFF

时间:2013-09-03 22:29:17

标签: python python-imaging-library tiff

每个tiff文件中都有4个图像。我不希望在可能的情况下提取和保存它们,我只想使用for循环来查看它们中的每一个。 (比如看一下像素[0,0]),根据它在4中的颜色,我会做相应的事情。

使用PIL可以吗? 如果不是我应该使用什么。

5 个答案:

答案 0 :(得分:14)

你可以使用"寻找" PIL图像的方法可以访问tif(或动画gif的帧)的不同页面。

from PIL import Image

img = Image.open('multipage.tif')

for i in range(4):
    try:
        img.seek(i)
        print img.getpixel( (0, 0))
    except EOFError:
        # Not enough frames in img
        break

答案 1 :(得分:7)

不是循环到EOFError,而是可以使用PIL.ImageSequence迭代图像页面(实际上与source code上看到的相同)。

from PIL import Image, ImageSequence

im = Image.open("multipage.tif")

for i, page in enumerate(ImageSequence.Iterator(im)):
    page.save("page%d.png" % i)

答案 2 :(得分:3)

这是一个读取多页tiff并将图像作为numpy数组返回的方法

from PIL import Image
import numpy as np

def read_tiff(path, n_images):
    """
    path - Path to the multipage-tiff file
    n_images - Number of pages in the tiff file
    """
    img = Image.open(path)
    images = []
    for i in range(n_images):
        try:
            img.seek(i)
            slice_ = np.zeros((img.height, img.width))
            for j in range(slice_.shape[0]):
                for k in range(slice_.shape[1]):
                    slice_[j,k] = img.getpixel((j, k))

            images.append(slice_)

        except EOFError:
            # Not enough frames in img
            break

    return np.array(images)

答案 3 :(得分:0)

今天必须做同样的事情,

我遵循@stochastic_zeitgeist的代码,并进行了改进(不要手动循环读取每个像素)以加快速度。

from PIL import Image
import numpy as np

def read_tiff(path):
    """
    path - Path to the multipage-tiff file
    """
    img = Image.open(path)
    images = []
    for i in range(img.n_frames):
        img.seek(i)
        images.append(np.array(img))
    return np.array(images)

答案 4 :(得分:0)

由于对此线程的回答,我编写了这个python模块,用于读取和操作多页tiff文件:https://github.com/mpascucci/multipagetiff

它还允许对图像堆栈进行“深度”颜色编码并进行z投影。

希望它能提供帮助