5

プレーンな C++ を使用してシームレスにブレンドするための画像ブレンド メソッドを実装しました。次に、このコードを GPU 用に変換します (モバイル デバイス用の OpenGL ES 2 シェーダーを使用)。基本的に、この方法では、各画像に対してガウス ピラミッドとラプラシアン ピラミッドが作成され、低解像度からトップに結合されます (Burt et.al. 1983 の論文「The Laplacian Pyramid as a Compact Image Code」も参照)。

私の問題は、ラプラシアン ピラミッド レベルが負の値を持つ可能性があることですが、私のデバイスは float または integer 型のテクスチャをサポートしていません (ORB_texture_float 拡張などを使用)。

GPU ベースのピラミッドを扱った論文を既に探しましたが、本当に役に立つものは見つかりませんでした。

  1. このようなピラミッドを GPU に効率的に実装するにはどうすればよいですか?
  2. 前のレベルを反復せずにガウス/ラプラシアン ピラミッド レベルを計算することは可能ですか?

よろしく、

EDIT 符号付きタイプ (ARB_texture_float など) またはより大きいタイプのいずれかをサポートしない 2 つのパス (符号用、値用) を使用する場合を除いて、GPU 上でラプラシアン ピラミッドを完全に計算する「良い」方法はないようです。画像のデータ範囲が [0..255] の間の場合のバイト。私のラプラシアン ピラミッドは、ARB_texture_float 拡張機能を備えた GPU で完全に動作しますが、拡張機能 (および範囲を圧縮するための調整) がないと、範囲圧縮のためにピラミッドが「間違った」ものになります。

4

1 に答える 1

6
  1. テクスチャが符号なし整数である場合にラプラシアン ピラミッドを実装する最も安全な方法は、2 つのピラミッドを格納することです。1 つのピラミッドにはラプラシアンの勾配の大きさが含まれ、もう 1 つのピラミッドにはその位置のピクセルの符号が格納されます。

  2. はい。ガウス ピラミッドまたはラプラシアン ピラミッドのレベルには、計算するシグマ値に基づく閉形式の解があります。シグマ = (2/3) の間隔で計算された Log ピラミッドの基本ケースを考えてみましょう。ピラミッドの最初のレベルはシグマ 2/3 を持ち、シグマ 2/3 で 5x5 の Log フィルターを畳み込むだけで生成されます。同じフィルターを使用した 2 番目の畳み込みはシグマ 4/3 の Log イメージを生成し、最後に 3 番目はシグマ 6/3 または 2 を持つため、イメージをサブサンプリングしてピラミッドの次の整数レベルを生成します。シグマ 2 で画像の LogG を計算する場合、シグマ 2/3 と 4/3 のレベルは必要ありません。単純に画像を 1 回サブサンプリングし、シグマ 1 の Log フィルターで畳み込みます。

sigma = 20 で LoG を計算する場合は、イメージをクワッド サブサンプリングして (16 ピクセル ブロックが 1 ピクセルになる)、シグマ 16 イメージを取得し、シグマ 4/3 LoG フィルターで 1 回畳み込みます。

于 2012-09-24T16:11:06.297 に答える