在 Python 中使用 JPEG 压缩有效地从大型多页 TIFF 中删除单个页面

问题描述 投票:0回答:1

我正在处理一个 JPEG 压缩的大型多页 TIFF 文件,我需要从中删除一页。我正在使用 tifffile Python 包来处理 TIFF,并且我已经根据与该页面关联的元数据标签知道要删除哪个页面。我当前的方法是读取所有页面,修改目标页面(通过跳过或替换它),然后将其余部分写回新的 TIFF 文件。

这是我迄今为止尝试过的:

import tifffile

with tifffile.TiffFile('file') as tif:
    for i, page in enumerate(tif.pages):
        if some condition with tags is true:
            # Skip the page to delete or replace with a dummy page

        image_data = page.asarray(memmap=True)  # Memory-mapped access to the page's data

        # Write the page to the output file
        writer.write(
            image_data,
            compression='jpeg',
            photometric=page.photometric,
            metadata=page.tags,
        )

但是,这种方法有几个问题:

  • 内存使用:处理大文件会消耗几乎所有可用内存(我有32GB RAM,但它最多使用28GB),这使得处理大文件不可行。

  • 压缩问题:LZW、ZSTD 和 JPEG 等不同的压缩方法会创建大小截然不同的文件,有些比原始文件大得多。

  • 性能:使用条带或分块等方法会导致处理速度非常慢,删除单个页面需要很长时间。

  • 输出文件大小:使用不同的压缩方法时输出文件的大小太大了! (JPEG 上 3GB 输入到 LZW 上 50GB+ 输出)

Python 有没有什么方法可以有效地从大型多页 TIFF 文件中删除单个页面,而不消耗太多内存或花费很长时间?我见过一些 .NET 包可以就地删除页面——Python 有类似的解决方案吗?

python out-of-memory tiff
1个回答
0
投票

我创建了一个 Python 包来处理它。虽然它可以变得更具可扩展性,但它可以有效地解决问题,而无需将所有图像数据加载到内存中。

核心理念:

该软件包的工作原理是:

  • 重建IFD(图像文件目录)链:删除了 关注 IFD,同时保留对原始图像数据的引用。
  • 调整元数据:指向“标签”信息的元数据 在重建过程中隐式更新。内存
  • 效率:通过引用实际图像数据,该包避免了 需要将大图像文件加载到内存中。

安装: 您可以直接从 PyPI 安装该软件包:

pip install tiff-wsi-label-removal

用途: 安装后,您可以使用

remove-label
命令行工具从 TIFF 文件中删除标签:

bash
remove-label <input_tiff_file> <output_tiff_file>

当前的局限性和未来的工作:

该软件包功能齐全,但仍有改进的空间,包括使其更具可扩展性。

来自此处评论的建议和其他计划的功能正在包的 PyPI 页面的描述中进行跟踪。

欢迎任何反馈!

© www.soinside.com 2019 - 2024. All rights reserved.