2011-12-30 3 views
1

は私が持っているものです。OpenGLのテクスチャ類似度/距離を計算する最速の方法は?ここで

  1. 私は256×256の言う、ディスクからテクスチャをロードし、私は同じ寸法で別のテクスチャを作成し、私はそれ
にいくつかのものを描くペンギン
  • の絵を言います

    2つのOpenGLテクスチャ間の距離をできるだけ早く(距離関数の精度が最も懸念される)求めたい。

    実際には、最初はテクスチャではない可能性があります。 フレームバッファの領域とロードされたテクスチャを比較したり、他の "魔法"を実行したりすることもできます。

    これを行うにはどうすればいいですか?

  • +2

    2つの画像間の「距離」をどのように定義しますか? –

    +0

    距離=(sR-dR)*(sR-dR)+(sG-dG)*(sG-dG)+(sB-dB)*(sB-dB) – JBeurer

    答えて

    5

    これは実際にOpenGLとほとんど関係がありません。 OpenGLは3Dラスタライズ "ドライバ"です。

    主なアイデアは距離/類似アルゴリズムを得ることです。これは手間のかかる作業です。最初はRoot Mean Square Deviationアルゴリズムを実行することができます。ピクセル値がどのくらい離れているかがわかります。

    CPUに実装するときは、必要に応じてベンチマークしてOpenCLに変換することができます。私はGPUに「ペンギン」をロードするだけでは、あなたが用意する他の形状と比較することはできないと思います。

    あなたの次の質問でより具体的にし、「私は非常によく顕微鏡を持っていますが、どのように超高速で釘を打つのですか?

    +1

    +1 RMSDは技術的な "ノイズ"の相違点で優れているが、例えばそれ以外の場合は2枚のピクセルでオフセットされた同一の画像が2つあり、時には_visually_完全に同一の画像に対して不当に悪い値を与えることがあります。それでも、おそらく、これはおそらく最良の、最も簡単で、最も速い解決策です(ミップマップを生成し、ミップレベル3または4で差の合計を行うことを除いて)。それは本当に一つが望むものにも依存します。 – Damon

    +1

    私はOpenGLで十分な処理をしなければならないと言いたいです。なぜなら、最大のパフォーマンスヒットはglReadPixelsから来て、ピクセルごとのピクセルとCPU上のソースイメージを比較するからです。この類似性の計算が何らかの形でGPUで行われると、パフォーマンスは少なくとも10倍向上すると私は確信しています。 – JBeurer

    +0

    これはアプリケーションによって大きく異なります。私たちはあなたがレンダリングしたものが「ペンギン」の画像と比較される必要があるかどうかわかりません。 – Kromster

    2

    ピアソンプロダクトを使用して、さまざまな画像を照合することができます。あなたは私のanswerで見つけることができます。元のイメージよりもテンプレートを少しだけマッチングさせる代わりに、2つのイメージを直接関連付けることができます。

    まもなく、各テキスチャの平均との偏差が得られ、相関係数が得られます。

    しかし、シェーダを使用してそのアルゴリズムを改善することは少し難しいかもしれません。まず、テキスト平均を計算する必要があります。ヒストグラムのようなOpenGLの拡張機能がこの作業に役立つかもしれません。

    次に、フラグメントシェーダを使用して、単一成分計算を実行することができます(以前に計算された平均テールベルとの差異)。平均テールセルは均一に渡されなければならず、結果は浮動小数点テクスチャ(あなたはフレームバッファオブジェクトの上に描画することができます)。

    その後、次の2つの源泉テクスチャとの間の相関関係を得るためにその結果、テクスチャのすべてtextelをまとめる必要があります。

    場合の価値は、この5月画像が非常に大きい場合は、SIMD命令セット(MMX、SSE、AVXなど)を使用してCPU上でアルゴリズムを実行するほうが良いと思います。

    関連する問題