2017-04-19 877 views
9

我想讀取和平鋪一個jp2圖像文件。圖像是RGB 98176 x 80656像素(它是醫學圖像數據)。Python打開jp2醫學圖像 - Scipy,glymur

當試圖讀取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)) 

平鋪不工作,讀方法是行不通的。

編輯:

我也嘗試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

閱讀巨大醫學圖像的標準事物是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 

不是很大,但如果你是病人它可能工作。

+0

我嘗試了一些實驗和libvips可悲的是通過MagickCore無法加載在部分圖像,我忘了與PingImage一些問題()使這不可能的。我已將我的答案更改爲指向轉換中的作物加載。 – user894763

+0

嗨。謝謝。我試圖與OpenJPG合作,然後詢問並得到: [INFO]開始閱讀j2k主標題(85)。 [ERROR]防止緩衝器溢出(X1:80656,Y1:98176) [ERROR]標記處理函數無法讀取標記段 ERROR - > opj_decompress:未能讀取頭 當與轉換工作我得到: 轉換:沒有解碼這個圖像格式的代理'JP2'@ error/constitution.c/ReadImage/501。 轉換:沒有圖像定義'sdf.tiff'@ error/convert.c/ConvertImageCommand/3210。 而我不知道如何安裝代表。 –

+0

我最終把它加載到matlab,悲傷。我想找到一個不依賴私人軟件的好開放方式。但我想繼續嘗試。 –

0

您可以使用glymur模塊在Python輕鬆訪問全分辨率圖像

+0

您能否展示一個示例? –

+0

在這裏,您可以獲得有關如何安裝和使用glymur的信息[glymur.readthedocs.io/] 簡單地說,讓我們說PATH是我的jp2文件的路徑。 '進口glymur' '圖像= glymur.Jp2k(PATH)'' ** 從這裏,你將能夠閱讀,例如與folllowing命令第一高分辨率瓦:** 'tile1 =圖像.read(tile = 0)' –

+0

你似乎不明白這個問題。圖像太大。所以沒有閱讀方法可行。 glymur.lib.openjp2.OpenJPEGLibraryError:OpenJPEG庫錯誤:防止緩衝區溢出(x1:80656,y1:95680) OpenJPEG庫錯誤:標記句柄函數無法讀取標記段 –

4

我從幻燈片掃描儀使用的文件在面對他們時刻相同問題的每個瓦片。 我發現有用的是平鋪使用VIP和openslide使用以下命令圖像:源圖像與您選擇和pixeloverlap的瓷磚尺寸的0級(全分辨率)的

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

這將輸出磚0到tartget目錄。

希望這有任何幫助。 馬里奧

+0

這看起來很有前途,謝謝。什麼是dzsave選項? –

+0

可悲的是,它不適用於JPEG 2000,但它是一個起點。我希望避免使用任何私人軟件,現在我使用matlab將它從jp2轉換爲tiff。但是這是DeepZoom的一個很好的工具。 –

+0

只是出於好奇,哪個醫療設備本身輸出jp2? –

1

你是否嘗試使用openslide。

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