2017-04-19 21 views
9

私はjp2イメージファイルを読み込んでタイルを作成しようとしています。画像はRGB 98176×80656ピクセル(医用画像データ)です。私は、画像が大きすぎる理解Python open jp2 medical images - Scipy、glymur

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

:glymurで画像を読み取ろうとすると

は、私はこのエラーを取得します。私が必要とするのは、画像データをタイルで読み取って別の場所や別の形式で保存することです。例えば、コードストリームであるよう

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)) 

タイルのdoesntの作業は、読み出し方法は動作しません。

編集:私はまた、ヘッダが、同じことを読み取ることができる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は大きなjp2画像のセクションをOpenJPEG経由で読み込みますが、特に高速ではありません。私は、例えば、ここでは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[100x100+0+0] x.png 
real 0m7.026s 
user 0m6.748s 
sys 0m0.276s 

大きなないが、あなたが患者なら、それはうまくいくかもしれない:

$ time convert sekscir25.jp2 -crop 100x100+0+0 x.png 
real 0m19.887s 
user 0m19.380s 
sys 0m0.504s 

しかし、私はロード中に作物をすれば、それがスピードアップありません。

+0

私はいくつかの実験を試してみましたが、悲しいことにMagickCore経由のセクションで画像を読み込むことができない、私はPingImageといくつかの問題は、()、これは不可能にすることを忘れていlibvips。私は代わりにコンバート時にcrop-on-loadを指すように答えを変更しました。 – user894763

+0

こんにちは。ありがとうございました。私は尋ねる前にOpenJPGで作業しようとした: [情報] j2kメインヘッダ(85)を読むことを開始します。 [ERROR]防止バッファオーバーフロー(X1:80656、Y1:98176) [ERROR]マーカーハンドラ関数はマーカセグメントを ERRORを読み取ることができなかった - > opj_decompress:私が得た変換を使用する場合ヘッダ を読み取ることができませんでした: 変換:このイメージフォーマット 'JP2 '@developeデリゲートは存在しません@ error/components.c/ReadImage/501。 convert:画像は 'sdf.tiff '@ error/convert.c/ConvertImageCommand/3210と定義されていません。 デリゲートのインストール方法はわかりません。 –

+0

私は悲しいことに、それをmatlabにロードし終わった。私は私的なソフトウェアに頼らないでいいオープンな方法を見つけたいと思っていました。しかし、私は努力し続けたい。 –

0

あなたは、私がスライドスキャナからのファイルを使用してそれらの瞬間を同じ問題に直面しています簡単にフル解像度の画像

+0

サンプルを表示できますか? –

+0

ここでは、glymurをインストールして使用する方法に関する有用な情報を得ることができます[glymur.readthedocs.io/] PATHが私のjp2ファイルへのパスであるとしましょう。ここからは、例えば、folllowingコマンドを使用して、最初の高解像度のタイルを読むことができるようになります '輸入glymur' '画像= glymur.Jp2k(PATH) '' **:** 'tile1 =画像.read(tile = 0) ' –

+0

あなたはその質問を理解していないようです。画像が大きすぎます。したがって、読み込みメソッドは機能しません。 glyemur.lib.openjp2.OpenJPEGLibraryError:OpenJPEGライブラリエラー:バッファオーバーフローの防止(x1:80656、y1:95680) OpenJPEGライブラリエラー:マーカーハンドラ関数がマーカーセグメントの読み取りに失敗しました –

4

の各タイルにアクセスするにはpythonでglymurモジュールを使用することができます。

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

元画像のレベル0(フル解像度)のこの意志の出力タイルはあなたが選んだとのpixeloverlapのタイルサイズ:私は、次のコマンドでVIPとopenslideを使用してイメージをタイリングして有用であることが判明何 0をtartgetディレクトリーに追加します。

これは何かの助けになると思います。 マリオ

+0

これは有望そうです、ありがとうございます。 dzsaveオプションは何ですか? –

+0

悲しいことに、2000年のjpegでは動作しませんが、それは出発点です。私の希望は、プライベートソフトウェアを使用しないようにすることです。今は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') 
関連する問題