8

約 20000 x 20000 ピクセルの 1 GB の大きな tiff 画像を扱っています。ランダムな位置で、画像からいくつかのタイル (約 300x300 ピクセル) を抽出する必要があります。

私は次の解決策を試しました:

  • Libtiff (私が見つけた唯一の低レベル ライブラリ) は TIFFReadline() を提供しますが、これは約 19700 の不要なピクセルを読み取ることを意味します。

  • 不要なピクセルを読み取らずに画像からタイルを抽出する独自の tiff リーダーを実装しました。もっと速いと思っていましたが、タイルのすべての行に対してシークを実行すると、非常に遅くなります。また、タイルを含むファイルのすべての行をバッファーに読み取ってから、バッファーからタイルを抽出しようとしましたが、結果はほぼ同じです。

タイル抽出ツールを改善するための提案を受け取りたいです!

すべてを歓迎します。私が使用できるより効率的なライブラリ、C/C++ I/O に関するヒント、私のニーズに対するより高いレベルの戦略などを提案していただけないでしょうか。

よろしく、フアン

4

5 に答える 5

3

[2010 年 1 月 14 日の大幅な編集]

ティフがタイル化されていない場合、タイルについてのあなたの言及に少し混乱しました。

タイル/ピラミッド TIFF 画像を使用します。VIPSで作成しました

vips im_vips2tiff source_image output_image.tif:none,tile:256x256,pyramid

私はあなたがこれを行うことができると思います:

vips im_vips2tiff source_image output_image.tif:none,tile:256x256,flat

タイル サイズを試してみることをお勧めします。その後、TIFFReadEncodedTile を使用して読み取ることができます。

ズームイン/ズームアウトする必要がある場合は、ピラミッド型 tiff を使用したマルチ解像度ストレージの方がはるかに高速です。これを使用して、粗い画像の直後に詳細な画像を表示することもできます。

(適切なサイズの) タイル ストレージに切り替えた後 (これにより、ランダム アクセスのパフォーマンスが大幅に向上します!)、ボトルネックはディスク IO になります。ファイルの読み取りは、順番に読み取るとはるかに高速になります。ここでは、 mmapping が解決策になる場合があります。

いくつかの便利なリンク:

VIPS IIPImage LibTiff.NET stackoverflow VIPS は、単なる読み取り/書き込み以上のことができる画像処理ライブラリです。独自の非常に効率的な内部形式があります。アルゴリズムに関する優れたドキュメントがあります。1 つは、処理をファイル システムから分離することで、タイルをキャッシュできるようにすることです。

IIPImage は、マルチズーム Web サーバー/ブラウザー ライブラリです。ドキュメントは、マルチ解像度イメージング (Google マップなど) に関する非常に優れた情報源であることがわかりました。

このページのもう 1 つのソリューションは、mmap を使用したもので、「小さな」ファイルに対してのみ有効です。私は 32 ビットの境界に頻繁にぶつかりました。一般に、32 ビット OS (4 GB の RAM がインストールされている) で 1 GB のメモリ チャンクを割り当てると失敗します。これは、1 回または 2 回のアプリケーションの実行後に仮想メモリでさえ断片化されるためです。それでも、画像の一部または全体をキャッシュするのに十分なメモリがあります。より多くのメモリ = より多くのパフォーマンス。

于 2010-01-04T20:41:29.753 に答える
2

ファイルをmmapするだけです。

http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html

于 2009-10-30T22:09:41.257 に答える
2

返信ありがとうございます。

実際には、タイルが要求される方法が変更されたため、ハードディスク内のファイルから、ランダムな方法ではなく、シーケンシャルな方法でタイルを抽出できるようになりました。これにより、ファイルの一部を RAM にロードし、そこからタイルを抽出することができました。

効率の向上は非常に大きかった。それ以外の場合、ファイルへのランダム アクセスが必要な場合は、mmap がお得です。

よろしく、フアン

于 2010-04-21T08:07:09.093 に答える
0

任意に大きな TARGA(TGA) 形式のファイルを処理するために、これと同様のことを行いました。その種のファイルを簡単にしたのは、画像が圧縮されていないことです。画像内の任意のピクセルの位置を計算し、単純なシークで見つけることができます。画像エンコーディングを指定するオプションがある場合は、targa 形式を検討してください。

そうでない場合でも、さまざまな TIFF 形式があります。さまざまな形式をすべてサポートするという苦労をすでに経験している場合は、おそらくライブラリを使用したいと思うでしょう。

于 2010-01-04T20:51:55.787 に答える
-1

特定のエラーメッセージが表示されましたか?そのコマンドラインの使用方法によっては、自分のファイルを踏んでいた可能性があります。

それが問題ではなかった場合は、オプションであればvipsの代わりにimagemagickを使用してみてください。

于 2010-11-08T20:26:03.953 に答える