我正在尝试从Hamamatsu NanoZoomer幻灯片扫描仪生成的文件中提取图像内容。 NDPI文件使用修改后的TIFF结构,并将图像内容以JPEG格式存储在一个大块中。使用StripOffsets和StripByteCounts,我能够提取应该是JPEG文件的数据。
数据流具有JPEG文件的所有正确签名,例如FFD8,扫描标记的开始和FFD9,扫描结束标记。如果这是一个小于65500 * 65500像素的图像,那么如果我将数据流保存到jpeg文件中,我可以正常打开文件。
在JFIF标题中,FFC0标记后面的第三个和第四个字节表示图像高度;之后的两个字节表示图像宽度。然而,对于大于65500 * 65500像素(实际上是122880 * 78848像素)的图像,这四个字节应该表示图像高度和图像宽度都是零。我在this之后将其更改为255,220,255,220(第255-263行)。当我在Windows中右键单击jpeg信息并选择了详细信息时,我确实看到Windows Photo Viewer读取分辨率为65500 * 65500,尽管它们并不代表真正的像素分辨率。问题是,当我试图打开图像时,它显然以错误的方式解码。
所以我的问题是:我怎样才能正确打开这样的jpeg文件?或者说,如何才能将整个此类图像内容正确解码到内存中?
我现在正试图使用MATLAB理解文件结构。最终我将使用Python + OpenCV(或者如果需要,使用Python + Cython + libjpeg-turbo)将整个图像读入内存。
答案 0 :(得分:0)
没有更多线索,只是一些评论:
这些已经是大量的连续记忆;特别是在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。
答案 1 :(得分:0)
我会使用openslide加vips,它可以快速直接支持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像素的图像。
您还可以使用视频将ndpi图像转换为像ppm这样的简单图像。加载到内存中应该是微不足道的。
$ vips copy ~/Desktop/pics/2013_09_20_29.ndpi huge.ppm
您打算做什么样的处理?
如果您感到好奇,则openlide网站有一个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获取帮助。