Python打开jp2医学图像 - Scipy,glymur

10

我尝试阅读并平铺一个jp2图像文件。该图像是RGB 98176 x 80656像素(它是医学图像数据)。

使用glymur尝试读取图像时,我会收到以下错误:

glymur.lib.openjp2.OpenJPEGLibraryError: OpenJPEG library error:  Prevent buffer overflow (x1: 80656, y1: 98176)

我知道这张图片太大了。我需要按瓦片读取图像数据并将其保存在其他地方和另一种格式中。

Glymur允许我使用Python读取头文件,因此例如,代码流为:

>>> print(codestream.segment[1])
SIZ marker segment @ (87, 47)
    Profile:  no profile
    Reference Grid Height, Width:  (98176 x 80656)
    Vertical, Horizontal Reference Grid Offset:  (0 x 0)
    Reference Tile Height, Width:  (832 x 1136)
    Vertical, Horizontal Reference Tile Offset:  (0 x 0)
    Bitdepth:  (8, 8, 8)
    Signed:  (False, False, False)
    Vertical, Horizontal Subsampling:  ((1, 1), (1, 1), (1, 1))

瓷砖无法使用,read方法不起作用。
编辑: 我还尝试了Scipy,它能够读取标头,但是出现了相同的错误:
>>> import scipy.misc
>>> image=scipy.misc.imread('Sl0.jp2')
/home/user/anaconda2/lib/python2.7/site-packages/PIL/Image.py:2274: DecompressionBombWarning: Image size (7717166080 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.
  DecompressionBombWarning)
>>> scipy.misc.imwrite('/home/user/Documents/imageCfromjp2.tif',image)
/home/user/
AttributeError: 'module' object has no attribute 'imwrite'
>>> scipy.misc.imsave('/home/user/Documents/imageCfromjp2.tif',image)
/home/user/
  File "/home/user/anaconda2/lib/python2.7/site-packages/scipy/misc/pilutil.py", line 195, in imsave
    im = toimage(arr, channel_axis=2)
  File "/home/user/anaconda2/lib/python2.7/site-packages/scipy/misc/pilutil.py", line 287, in toimage
    raise ValueError("'arr' does not have a suitable array shape for "
ValueError: 'arr' does not have a suitable array shape for any mode.
>>> image2=image[0:500,0:500]
/home/user/
IndexError: too many indices for array
>>> image2=image[0:500]
/home/user/
ValueError: cannot slice a 0-d array

有没有办法将图像数据流到不同类型的容器中,以便索引号不成问题,并使我能够处理它?
4个回答

5

我现在面临着与他们相同的问题,使用幻灯片扫描仪的文件。 我发现使用以下命令使用vipsopenslide平铺图像非常有用:

vips dzsave image.mrxs targetdirectoryname --depth one --tile-size 2048 --overlap 0

这将输出源图像的0级瓦片(完整分辨率),瓦片大小由您选择,并且像素重叠为0,输出到目标目录。


这看起来很有前途,谢谢。dzsave选项是什么? - lesolorzanov
遗憾的是它不支持jpeg 2000,但这是一个起点。我的希望是避免使用任何私有软件,现在我使用matlab将其从jp2转换为tiff。但这是DeepZoom的一个很好的工具。 - lesolorzanov
D-sight是我们的合作伙伴正在使用的扫描仪。但我不建议使用它。虽然它有一个非常好的压缩功能,但仍然很难使用。 - lesolorzanov
谢谢提供这个信息,我之前不知道。我们使用的是3D Histech Pannoramic Flash 250 II扫描仪,它非常好用,但MRXS格式使用开源工具处理起来很麻烦。 - Mario Kreutzfeldt
同样的问题。作为该领域内的一位专业人士,你会推荐在组织学中使用哪种图像文件类型呢? - lesolorzanov
显示剩余2条评论

4

读取大型医学图像的标准方法是使用openslide,建议首先尝试该方法。我不确定它是否可以直接读取jp2格式,但假设这是来自幻灯片扫描仪,也许可以保存为openslide支持的其中一种格式?

ImageMagick将通过OpenJPEG加载大型jp2图像的部分区域,尽管速度不快。例如,我有一个10k x 10k的jp2图像,如果转换为JPG,则会看到:

$ time convert sekscir25.jp2 x.jpg
real    0m25.378s
user    0m24.832s
sys 0m0.544s

如果我试图裁剪出一个小块,这几乎没有任何快捷方式,这表明IM总是解码整个图像:
$ time convert sekscir25.jp2 -crop 100x100+0+0 x.png
real    0m19.887s
user    0m19.380s
sys 0m0.504s

但如果我在加载时进行裁剪,它确实会加速:

$ time convert sekscir25.jp2[100x100+0+0] x.png
real    0m7.026s
user    0m6.748s
sys 0m0.276s

不是很理想,但如果你耐心一点,它可能会起作用。

我尝试了一些实验,不幸的是libvips无法通过MagickCore以分段方式加载图像,我忘记了PingImage()存在一些问题,这使得这种操作变得不可能。我已经修改了我的答案,指向了convert中的crop-on-load。 - jcupitt
你好。谢谢。在提问之前,我尝试使用OpenJPG进行工作,但是出现了以下错误: [INFO] 开始读取j2k主标头(85)。 [ERROR] 防止缓冲区溢出(x1:80656,y1:98176) [ERROR] 标记处理程序函数无法读取标记段 ERROR-> opj_decompress:无法读取标头 在使用convert时,我得到了以下结果: convert:没有解码委托来处理此图像格式“JP2”@ error / constitute.c / ReadImage / 501。 convert:未定义任何图像“sdf.tiff”@ error / convert.c / ConvertImageCommand / 3210。 我不知道如何安装委托。 - lesolorzanov
我最终加载到了Matlab中,可惜。我想找到一种不依赖私有软件的好的开放方式。但我想继续尝试。 - lesolorzanov
我也尝试过使用openslide,但正如你所说它不支持加载jp2格式文件,不过我可以尝试将其转换为tiff格式并在我的管道中使用openslide。 - lesolorzanov

3

你是否尝试使用Openslide。

import openslide
from openslide.deepzoom import DeepZoomGenerator
osr=openslide.OpenSlide('JP2.svs')
im=osr.get_thumbnail((200,200))
im.save('test.jpg')

0

你可以在Python中使用glymur模块轻松访问完整分辨率图像的每个瓦片


在这里,您可以获取有关如何安装和使用glymur的有用信息[glymur.readthedocs.io/]。 简单来说,假设PATH是我的jp2文件的路径。import glymur image=glymur.Jp2k(PATH)从这里开始,您将能够通过以下命令读取例如第一个高分辨率图块: tile1=image.read(tile=0) - Francisco Cunha
你似乎不理解这个问题。图片太大了,所以没有任何读取方法可以奏效。glymur.lib.openjp2.OpenJPEGLibraryError: OpenJPEG库错误:防止缓冲区溢出(x1: 80656,y1: 95680)OpenJPEG库错误:标记处理程序函数无法读取标记段。 - lesolorzanov
@ZloySmiertniy,你能成功完成任务吗?我现在也遇到了类似的问题,缺乏对jp2格式的支持。你有没有想过如何使用Python读取和显示这样的图像?谢谢。 - Francisco Cunha
@FranciscoCunha 到目前为止,我已经找到了GDAL,因此我将把它视为GIS图像。https://dev59.com/VIvda4cB1Zd3GeqPXUgd#39664684 - lesolorzanov

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