如何正确打开/解码具有超过65500 * 65500像素的jpeg图像?

5
我试图从由浜松NanoZoomer幻灯片扫描仪生成的文件中提取图像内容。 NDPI文件使用修改后的TIFF结构,并在一个大块中以JPEG格式存储图像内容。使用StripOffsets和StripByteCounts,我能够提取应该是JPEG文件的数据。
数据流具有JPEG文件的所有正确标识,例如FFD8(扫描开始标记)和FFD9(扫描结束标记)。如果这是一个小于65500*65500像素的图像,则将数据流保存为jpeg文件后,我可以正常打开该文件。
在JFIF头部中,FFC0标记后的第三个和第四个字节表示图像高度;之后的两个字节表示图像宽度。然而,对于大于65500*65500像素(实际上是122880*78848像素)的图像,这四个字节都是零。我按照this(255-263行)更改了它们为255、220、255、220。当我右键单击图像并选择详细信息时,我发现Windows照片查看器将分辨率读取为65500*65500,尽管它们并不代表真实的像素分辨率。问题是,当我尝试打开图像时,它显然被错误解码了。

所以我的问题是:如何正确打开这样的jpeg文件?或者说,如何正确地将整个图像内容解码到内存中?

我现在正在使用MATLAB来理解文件结构。最终我将使用Python + OpenCV(或者使用Python + Cython + libjpeg-turbo如果必要)将整个图像读入内存。


由于我没有你的图像进行测试,所以很难说,但如果你正在处理大型图像,一定要考虑使用 vips。它在这方面表现出色... http://stackoverflow.com/a/36377369/2836621 - Mark Setchell
我认为这是一个libjpeg或libjpeg-turbo的问题。VIPS正在使用其中之一。因此,仅仅切换到VIPS并不能解决这个问题。 - user3667217
我已经编写了自己的图像库(包括自定义JPEG编解码器),这个图像有可能被我的代码打开。由于其极端大小,一次性打开它会出现问题。我可以打开一个缩小的副本(1/8 x 1/8 = 14848 / 12800),或者打开其中的一个矩形裁剪。完整的分辨率彩色未压缩图像需要36GB的RAM。 - BitBank
请直接联系我以继续对话 -> bitbank@pobox.com - BitBank
@user3344003 - 我们知道。OP的图像是使用JPEG压缩的TIFF文件。TIFF支持更大的尺寸,他正在尝试各种方法来提取它或以解决方法打开它。 - BitBank
显示剩余2条评论
2个回答

0

没有更多的线索,只是一些备注:

  • 65500x65500 = 3GiO/通道(工作中)
  • 122880*78848 = 9GiO/通道(目标)

这已经是巨大的连续内存量了;特别是在 Windows 上,这种应用程序有一些限制(请查看此处以获取更多信息

首先,您能否提供有关您正在尝试打开此图像的计算机或软件的任何详细信息?(RAM 的数量、交换、分配给用户空间的最大内存等)

完全随机的猜测,您是否尝试过使用 ImageJ?

是否可能仅实时打开您想要查看的区域(我不确定您是否想要查看整个图片)?

为什么不使用多尺度图像表示?

编辑:我刚看到IN2P3提供的将文件格式转换为TIFF的工具。这也让我想知道你是否真的在其中隐藏了JPEG或TIFF。


我确实需要将整个图像存储在内存中。ImageJ甚至无法打开像素分辨率乘积大于65535的文件。我的计算机有32 GB的RAM。我尝试在Windows照片查看器和Photoshop中打开该文件,两者都给了我相同的显示。 - user3667217

0

我会使用openslidevips,它们对ndpi图像有快速和直接的支持。然后,您可以将解码后的图像复制到Matlab、Numpy中,或者只是使用vips进行处理,具体取决于您需要做什么。

例如,我可以写:

#!/usr/bin/python

import sys
import gi
gi.require_version('Vips', '8.0')
from gi.repository import Vips

im = Vips.Image.new_from_file(sys.argv[1])
im = im.crop(1000, 1000, 2000, 2000)
im.write_to_file(sys.argv[2])

然后执行:

$ time ./try228.py ~/Desktop/pics/2013_09_20_29.ndpi x.png
memory: high-water mark 15.24 MB
real    0m1.561s

这是一个118784 x 102400像素的图像。

你也可以使用vips将ndpi图像转换为诸如ppm之类的简单格式。这样应该很容易加载到内存中。

$ vips copy ~/Desktop/pics/2013_09_20_29.ndpi huge.ppm

您打算进行什么类型的处理?

如果您感兴趣,openslide网站提供了ndpi文件格式的良好概述

这里有64位Windows二进制文件可用于vips。只需解压缩并运行 vips.exe 即可。

vips GUI工具nip2可以轻松处理您的图像。这里有一个Windows安装程序。启动程序并点击“文件/打开”,或将.ndpi图像从资源管理器中拖到程序中。在主窗口中双击缩略图以打开视图窗口。使用工具包菜单处理图像。按F1键获取帮助。


谢谢你的回答。我实际上查阅了openslide代码以帮助我理解ndpi格式。我需要的是:1:将整个图像转换为deepzoom图像格式。2:将整个图像读入内存以进行图像处理。对于1),我认为openslide + vpis可以完成工作,因为它不需要涉及读取整个图像,现在有问题的是第二个要求。 - user3667217
是的,对于1)只需执行 vips dzsave slide.ndpi my-pyr-name。对于2),我会将其转换为ppm格式并加载到内存中,这应该非常容易。您计划进行什么处理? - jcupitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接