15

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

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

4

5 回答 5

25

而不是循环直到 a EOFError,人们可以使用迭代图像页面PIL.ImageSequence(这实际上等同于在源代码中看到的)。

from PIL import Image, ImageSequence

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

for i, page in enumerate(ImageSequence.Iterator(im)):
    page.save("page%d.png" % i)
于 2017-12-13T08:44:52.687 回答
22

您可以使用 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
于 2013-09-06T13:13:52.647 回答
6

今天不得不做同样的事情,

我按照@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)
于 2019-06-12T07:29:58.983 回答
4

这是一个读取多页 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)
于 2017-07-05T11:52:08.460 回答
0

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

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

希望它可以帮助

于 2019-11-10T19:37:57.593 回答