【问题标题】:Larger than expected file sizes when saving a TIFF with OpenCV使用 OpenCV 保存 TIFF 时文件大小大于预期
【发布时间】:2020-07-12 04:21:34
【问题描述】:

我正在创建一个 python 程序来加载 .tiff 图像,从图像中裁剪出一个选区,并将选区保存为 tiff。数据集图像很大,超过 1GB。我可以成功裁剪出我需要的内容并保存为 tiff,但新的图像文件大小比我预期和需要的要大得多。

开幕
我正在使用 tifffile 将图像作为 numpy 数组打开。 OpenCV 和 PIL 因文件大小而无法打开文件。我也尝试使用 OpenSlide,但在使用 read_region() 时遇到了其他问题。

裁剪
numpy 数组的形状为(height, width, 3),因此我使用large_image[top:bottom, left:right, :] 之类的东西进行裁剪。这按预期工作。

保存
到目前为止,使用cv2.imwrite() 已经产生了最小的文件大小,但它们仍然比应有的大得多。来自tifffilePIL.Image.save()TiffWriter 创建了更大的图像。

最佳结果:从 250MB 的文件中裁剪 13 张新图像 - 仅使用原始图像的 20% 左右 - 给我的文件总计超过 900MB。我希望总数约为 50MB。

注意:裁剪后的 .tiff 文件具有正确的尺寸。如果原始文件是200,000 x 50,000,那么裁剪后的文件就是8,000 x 3,000。此外,我无法在我的 Mac 上使用 Preview 打开原始的 250MB 图像,但是当我使用 TiffWriter 保存图像时,我可以快速打开由我的程序创建的 500MB 裁剪图像(我也可以打开使用 opencv 保存的文件) .

代码总结:

import tifffile
import cv2
import numpy as np

original_image = tifffile.imread('filepath') #original_image is a numpy array

#...calculations for top, bottom, etc...

cropped_image = original_image[top:bottom, left:right, :]
cv2.imwrite('output_filepath', cropped_image)

这3行是我使用的所有IO。

tl;dr - 尝试加载图像、裁剪并将新图像另存为 .tiff,但新文件大小比预期大得多。

【问题讨论】:

  • 没有单一的“TIFF 格式”。 TIFF 可以以多种不同的方式包含图像。特别是,可以使用不同的方法压缩数据。您的输入图像很可能是使用 JPEG 或 JPEG2000 压缩的,而您正在编写的 TIFF 不是压缩的或使用无损格式压缩的。
  • 为什么我在问题中看不到问号?

标签: python numpy opencv image-processing tiff


【解决方案1】:

如果您使用的是 Mac,homebrew 非常棒,您可以安装 libtiffImageMagick

brew install libtiff imagemagick

然后您就可以真正开始了解使用什么压缩、位数/样本和数据大小/类型:

tiffinfo YOURINPUTFILE.TIF
tiffinfo YOUROUTPUTFILE.TIF

和:

magick identify -verbose YOURINPUTFILE.TIF
magick identify -verbose YOUROUTPUTFILE.TIF

如果您想并排查看两者,请使用:

magick identify -verbose YOURINPUTFILE.TIF  > a
magick identify -verbose YOUROUTPUTFILE.TIF > b
opendiff a b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多