2016-07-06 44 views
4

私はHamamatsu NanoZoomerスライドスキャナによって生成されたファイルから画像コンテンツを抽出しようとしています。 NDPIファイルは、修正されたTIFF構造を使用し、1つの大きなチャンクにイメージコンテンツをJPEG形式で格納します。 StripOffsetsとStripByteCountsを使って、JPEGファイルと思われるデータを抽出することができます。65500×65500ピクセル以上のJPEG画像を正しく開く/デコードするにはどうすればよいですか?

データストリームには、JPEGファイルのすべての正しい署名(FFD8、スキャン開始マーカ、FFD9、スキャン終了マーカなど)があります。これが65500 * 65500ピクセルよりも小さい画像の場合、データストリームをjpegファイルに保存すれば、ファイルを正常に開くことができます。

JFIFヘッダーでは、FFC0マーカーの後の3番目と4番目のバイトはイメージの高さを表します。その後の2バイトは画像の幅を表す。しかし、画像が65500×65500ピクセル(実際には122880×78848ピクセル)より大きい場合、画像の高さと画像の幅を表す4バイトはすべてゼロです。 this(255-263行)に続いて255,220,255,220に変更しました。 Windowsで右クリックしてjpeg情報をチェックして詳細を選択したとき、実際のピクセル解像度を表さないという事実にもかかわらず、Windows Photo Viewerは解像度を65500 * 65500と読みました。問題は、画像を開こうとしたときに間違った方法でデコードされていることです。

私の質問です:どのように正しくjpegファイルを開くことができますか?あるいは、どのようにしてそのようなイメージの内容全体を正しくメモリにデコードすることができますか?

私は今、MATLABを使ってファイル構造を理解しようとしています。最終的に私はPython + OpenCV(またはPython + Cython + libjpeg-turboを必要に応じて使用)を使用して、画像全体をメモリに読み込みます。任意のより多くの手がかりなし

+0

私はテストする画像がないので、言うことは非常に難しいですが、大きな画像を扱っているなら、間違いなく 'vips 'の使用を検討してください。それは優秀です... http://stackoverflow.com/a/36377369/2836621 –

+0

私はこれがlibjpegまたはlibjpeg-turbo問題であると信じています。 VIPSはどちらか一方を使用しています。 VIPSに切り替えるだけでは、この問題を回避することはできません。 – user3667217

+0

独自のイメージングライブラリ(カスタムJPEGコーデックを含む)を作成しましたが、このイメージは自分のコードで開く可能性があります。極端なサイズは一気に開くことに問題があります。スケールされたコピー(1/8 x 1/8 = 14848/12800)を開くか、特定の長方形の切り抜きを開くことができます。完全な色の非圧縮画像は36GBのRAMが必要です。 – BitBank

答えて

0

、単にいくつかの発言:

  • 65500x65500 = 3GIO /チャネル(作業)
  • 122880 * 78848 = 9GiO /チャネル(目的)

これらはすでに巨大です連続したメモリの量。 (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を持っているのかどうか疑問に思っています。

+0

私はメモリ内の画像全体が必要です。 ImageJは65535を超えるピクセル解像度のファイルを開くことさえできませんでした。私のコンピュータには32GBのRAMがあります。私はWindowsフォトビューアとPhotoshopでファイルを開こうとしましたが、どちらも同じ表示をしました。 – user3667217

0

openslidevipsを使用すると、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]) 

を次にとして実行:118784 X 102400ピクセル画像に対してだつまり

$ time ./try228.py ~/Desktop/pics/2013_09_20_29.ndpi x.png 
memory: high-water mark 15.24 MB 
real 0m1.561s 

また、vipsを使ってndpiイメージをppmのような簡単なものに変換することもできます。それはメモリにロードするのは簡単ではありません。

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

どのような処理を予定していますか?

好奇心が強い場合は、openslideのWebサイトに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キーを押してヘルプを表示します。

+0

答えをありがとう。私は実際にndpiフォーマットを理解するのに役立つオープンソースのコードを参考にしました。私が必要とするのは次のとおりです。1:イメージ全体をdeepzoomイメージ形式に変換します。 2:画像処理のために画像全体をメモリに読み込む。 1)私は、画像全体を読むことを必要としないので、openslide + vpisが仕事をすることができると考えています。それは現在問題となっている第2の要件です。 – user3667217

+0

はい、1)のためだけに 'vips dzsave slide.ndpi my-pyr-name'を実行してください。 2)私はppmに変換してメモリにロードするので、非常に簡単なはずです。どのような処理を行う予定ですか? – user894763

関連する問題