8

大きな単一の画像に合成している非常に大きな tif 画像を使用しています。私の同僚が作成した、画像ピラミッドを生成し、画像ピラミッドを視覚化するための非常に便利なツールを提供するライブラリがあります。このビジュアライザーは、大きな画像のピークを取得し、関心のあるポイントを視覚的に特定するのに最適ですが、顧客はこれらの大きな画像の画像分析にもっと関心があります.

したがって、非常に大きな画像を 1 つのファイルにエクスポートする必要があります。これらのイメージのサイズが 800 MB から数 GB になる可能性があることを考えると、これは面倒だと思います。この単一の画像をメモリにロードするタスクだけでも、特に画像解析が行われている場合は困難です。

Javaでこの大きなtiff画像をブロックまたは行ごとに書き込むことができるかどうか疑問に思っていました。現在、小さな (8 GB RAM) マシンでアプリケーションのメモリが不足しています。

これらの画像を構成する現在の方法は次のとおりです。

  1. 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]);
        }
    }   
    
  2. 次に、バッファリングされたイメージをディスクに書き込みます。この部分では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[][]pixels20k 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/blob/v4.4.8/components/scifio/src/loci/formats/out/TiffWriter.java

リーダー: https://github.com/openmicroscopy/bioformats/blob/v4.4.8/components/scifio/src/loci/formats/in/TiffReader.java

メイングループページ: https://github.com/openmicroscopy/bioformats

4

4 に答える 4

2

OK、Javaでこれを行うための良い解決策を見つけました。

BigTiff を指摘してくれた @bdares に感謝します。

しかし、FIJI とパッケージ化されており、scifio を実装した bioformats グループがあります。

これらは、サポートされている多数のリーダー/ライターを提供します。そのうちの 1 つは TiffReader/Writer です。

https://github.com/openmicroscopy/bioformats/blob/v4.4.8/components/scifio/src/loci/formats/in/TiffReader.java

https://github.com/openmicroscopy/bioformats/blob/v4.4.8/components/scifio/src/loci/formats/out/TiffWriter.java

元の投稿を編集しました。コメントをありがとう、それは私が正しい方向を見るのを助けました.

于 2013-09-24T19:03:13.403 に答える
0

short の double 配列があります。これをメモリに保存する代わりに、ディスクに保存してディスク上で操作する必要があります。BufferedImage は役に立ちません。イメージをメモリに完全にロードしなくても、ディスク上のイメージを操作できるライブラリ (またはライブラリを作成する) が必要です。

各値に個別にアクセスする必要はありません。代わりに、次のようなことをしたいと思うでしょう:

  1. ブロックを読み取ります (おそらく、4k、8k、または 40k のいずれか)。
  2. ブロック全体を処理します。
  3. ブロックをディスクに書き込みます。
  4. 完了するまでステップ 1 に進みます。
于 2013-09-24T15:59:05.893 に答える