5

我正在尝试从 Hamamatsu NanoZoomer 幻灯片扫描仪生成的文件中提取图像内容。NDPI 文件使用修改后的 TIFF 结构,并将图像内容以 JPEG 格式存储在一大块中。使用 StripOffsets 和 StripByteCounts,我能够提取应该是 JPEG 文件的数据。

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

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

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

我现在正在尝试使用 MATLAB 了解文件结构。最终,我将使用 Python + OpenCV(或在必要时使用 Python + Cython + libjpeg-turbo)将整个图像读入内存。

4

2 回答 2

0

我会使用openslide plus 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 像素的图像。

您还可以使用 vips 将 ndpi 图像转换为简单的东西,例如 ppm。这应该很容易加载到内存中。

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

你打算做什么样的处理?

如果您好奇的话,openslide 网站对 ndpi 文件格式有很好的概述。

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

vips GUI,nip2,在处理您的图像时没有问题。有一个 Windows 安装程序。启动程序并单击文件/打开,或.ndpi从资源管理器中拖入图像。双击主窗口中的缩略图以打开视图窗口。使用工具包菜单来处理图像。按 F1 寻求帮助。

于 2016-07-06T13:00:36.947 回答
0

没有更多线索,只是一些评论:

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

这些已经是巨大的连续内存;尤其是在 Windows 上,它对此类应用程序有一些限制(请查看此以获取更多信息

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

完全随机猜测,您尝试过 ImageJ 吗?

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

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

编辑:我刚刚看到有一些工具可以将您的文件格式转换为由 IN2P3 完成的 TIFF。这也让我想知道您是否真的在其中隐藏了 JPEG 或 TIFF。

于 2016-07-06T08:20:10.353 回答