2009-10-30 41 views
8

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

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

  • のlibtiff(私は見つけることができる唯一の低レベルライブラリ)がTIFFReadlineを()提供していますが、それは周りの19700 unnecesaryピクセル単位で読んで意味。

  • 私は、不必要なピクセルを読み込まずに画像からタイルを抽出する独自のTiffリーダーを実装しました。私はそれがより速くなることを期待しましたが、タイルのすべてのラインについてseekgを実行すると非常に遅くなります。私はまた、私のタイルを含むファイルのすべての行をバッファに読み込み、バッファからタイルを抽出しようとしましたが、結果は多かれ少なかれ同じです。

私のタイル抽出ツールを改善する提案を受け取りたいと思います!

すべてがなど、C/C++ I/O、私のニーズのためのいくつかのより高いレベルの戦略についていくつかのヒント、多分あなたは、私が使用することができ、より効率的なライブラリを提案することができ、

よろしく、 フアン

歓迎です
+0

圧縮されていないと仮定できますか? –

+0

データはスキャンラインで整理されていますか? –

+0

はい、データは圧縮されていないと、ほとんどのトラディショナルな方法で構成されています ライン1 LINE2 LINE3 ... – Juan

答えて

2
+0

現在、このオプションをテストしています。お返事をありがとうございます。 – Juan

+0

64ビットオペレーティングシステムに興味があります。大きなtiffファイルは、32ビット境界を超えて簡単に移動します。私のXP上では、私は400MByte以上のビットマップを読むのに問題があります。なぜなら、 '仮想メモリ'の断片化です。つまり:私は、2GByteの空き(!)RAMがあっても、連続したメモリ空間の400MBのチャンクを見つけることはできません。 – Adriaan

3

[主編集1月14日10]

いさかいがタイル張りされていないとき、私は、タイルのあなたの言及で混乱少しでした。

タイル型/ピラミッド型のTIFF画像を使用します。

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

あなたはタイルサイズを試してみたいことがあります。私は、私はあなたがこれを行うことができると思いVIPS

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

を有するものを作成しました。次に、TIFFReadEncodedTileを使って読むことができます。

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

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

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

VIPS IIPImage LibTiff.NET stackoverflow VIPSは、単に読み取り/書き込みよりもはるかに多くを行うことができ、画像処理ライブラリです。独自の、非常に効率的な内部形式を持っています。それはアルゴリズムに関する良い文書を持っています。 1つは、処理をファイルシステムから切り離し、タイルをキャッシュすることです。

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

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

+0

TIFFは、タイル貼りをしたり、データの断片を含むことができます。これは、大きな画像の作成と読み取りを管理する唯一の方法です。 – WhoCares

0

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

TIFF形式にはさまざまな種類があります。すでにさまざまなフォーマットをサポートするという苦労をすでに経験している場合は、ライブラリを使用することをお勧めします。

2

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

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

効率の向上は大きかった。それ以外の場合、ファイルへのランダムアクセスが必要な場合は、mmapを使用するのがよいでしょう。

よろしく、 フアン

-1

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

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

関連する問題