2016-07-06 331 views
4

我试图从Hamamatsu NanoZoomer幻灯片扫描仪生成的文件中提取图像内容。 NDPI文件使用修改后的TIFF结构,并将图像内容以JPEG格式存储在一个大块中。使用StripOffset和StripByteCounts,我可以提取应该是JPEG文件的数据。如何正确打开/解码具有超过65500 * 65500像素的jpeg图像?

数据流具有JPEG文件的所有正确签名,例如FFD8,扫描标记的开始和FFD9,扫描标记的结束。如果这是一个小于65500 * 65500像素的图像,那么如果将数据流保存为jpeg文件,则可以打开文件。

在JFIF标题中,FFC0标记之后的第三个和第四个字节表示图像高度;之后的两个字节表示图像宽度。但是,对于大于65500 * 65500像素(实际上是122880 * 78848像素)的图像,这些假定表示图像高度和图像宽度的四个字节全部为零。我将它们改为255,220,255,220,跟在this(255-263行)。当我通过在Windows中右键单击来查看jpeg信息并选择细节时,我确实看到Windows Photo Viewer将分辨率读取为65500 * 65500,尽管它们并不代表实际的像素分辨率。问题是,当我试图打开图像时,它显然是以错误的方式解码的。

所以我的问题是:我该如何正确打开这样一个jpeg文件?或者说,我该如何正确解码这些图像内容的全部内容?

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

+0

因为我没有要测试的图像,所以很难说,但是如果你在处理大图像时一定要考虑使用'vips'。它擅长于... http://stackoverflow.com/a/36377369/2836621 –

+0

我相信这是一个libjpeg或libjpeg涡轮问题。 VIPS正在使用其中之一。所以只要切换到VIPS就不会解决这个问题。 – user3667217

+0

我已经编写了自己的图像库(包括自定义JPEG编解码器),并且此图像可能会被我的代码打开。极端的大小是一次打开它的一个问题。我可以打开缩放后的副本(1/8 x 1/8 = 14848/12800)或打开特定的矩形裁剪。完整的res颜色未压缩图像需要36GB的RAM。 – BitBank

回答

0

没有任何更多的线索,只是一些言论:

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

这些都已经巨大连续内存量特别是在Windows上,这对这类应用程序有一些限制(take a look at this for more info

首先,您可以提供您的计算机或软件与您试图打开此图像的任何细节? (RAM的数量,交换,分配给用户空间的最大内存等)

完全随机猜测,你试过用ImageJ吗?

是否可以随时打开你想看的区域(我不确定你想看到整个图像)?

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

编辑:我刚才看到有tools for your file format to be converted in TIFF done by the IN2P3。这也让我怀疑你是否真的有隐藏的JPEG或TIFF。

+0

我确实需要内存中的整个图像。 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网站有nice overview of the ndpi file format

有一个64-bit Windows binary for vips here。只需解压缩并运行vips.exe

vips GUI, nip2,将无法​​处理您的图像。 There's a windows installer。启动该程序并单击文件/打开,或从资源管理器拖入.ndpi图像。双击主窗口中的缩略图以打开查看窗口。使用工具箱菜单处理图像。按F1寻求帮助。

+0

感谢您的回答。我确实咨询了openslide代码以帮助我理解ndpi格式。我需要的是:1:将整个图像转换为深度缩放图像格式。 2:为了图像处理的目的,将整个图像读入存储器。对于1)我认为openslide + vpis可以完成这项工作,因为它不涉及阅读整个图像,现在是第二个需要解决的问题。 – user3667217

+0

是的,对于1)只要做'vips dzsave slide.ndpi my-pyr-name'。对于2)我会转换为ppm并加载到内存中,它应该很容易。你打算做什么处理? – user894763