大きな単一の画像に合成している非常に大きな tif 画像を使用しています。私の同僚が作成した、画像ピラミッドを生成し、画像ピラミッドを視覚化するための非常に便利なツールを提供するライブラリがあります。このビジュアライザーは、大きな画像のピークを取得し、関心のあるポイントを視覚的に特定するのに最適ですが、顧客はこれらの大きな画像の画像分析にもっと関心があります.
したがって、非常に大きな画像を 1 つのファイルにエクスポートする必要があります。これらのイメージのサイズが 800 MB から数 GB になる可能性があることを考えると、これは面倒だと思います。この単一の画像をメモリにロードするタスクだけでも、特に画像解析が行われている場合は困難です。
Javaでこの大きなtiff画像をブロックまたは行ごとに書き込むことができるかどうか疑問に思っていました。現在、小さな (8 GB RAM) マシンでアプリケーションのメモリが不足しています。
これらの画像を構成する現在の方法は次のとおりです。
BufferedImage
を使用してピクセル値を に格納します。WritableRaster
short[][]pixels = ... BufferedImage image = new BufferedImage(width, height, type); WritableRaster = image.getRaster(); for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { raster.setSample(col, row, 0, pixel[row][col]); } }
次に、バッファリングされたイメージをディスクに書き込みます。この部分では
ImageJ
、画像を tif として書き込むために使用しています。16 ビット グレースケール tif 画像をサポートするより良い方法がある場合は、喜んで見ていきます。// BufferedImage image; from above ... ImagePlus img = new ImagePlus(); img.setImage(image); FileSaver fs = new FileSaver(img); fs.saveAsTiff(file.getAbsolutePath());
この方法の問題点は、8 GB の RAM マシンに対してメモリ フットプリントが大きすぎることです。
理想的には、単一のshort[][]pixels
. これは主に、平均ブレンディング関数を計算する必要があるためです。そのため、ある程度のメモリ フットプリントが存在します。また、将来的には線形ブレンドを追加する予定です。はshort[][]pixels
20k x 20k ピクセルのデータに対して ~765 MB の RAM しか占有しないはずですが、これは現在避けられないと思います。そのため、100k x 100k ピクセルなどの大きな画像の場合、生物学者がこの画像をそのままエクスポートしたくないことを願っています。 18GBのRAMを占有します。
後で、100k x 100k のような非常に大きな画像のエクスポートをサポートするようにコードを変更します。今のところ、最初のピクセル値を格納するために 1 つのメモリを想定しても問題ありません。
では、100k x 100k イメージなどのコア イメージの書き込みをサポートできるように、tif イメージの一部をディスクに書き込むための適切な方法は何でしょうか。
私はこの投稿を見ました:JavaでImageIOを使用して、TIFFのタイル出力を書きます
ただし、TIFF 6.0 仕様について説明しているだけです。しかし、私は調べますImageOutputStreams
。ただし、Tif は獣なので、私は弾丸を噛んで生物学者に関心のある領域のみをエクスポートするように勧めるかもしれません。
編集:実行可能な解決策が見つかりました:
と
メイングループページ: https://github.com/openmicroscopy/bioformats