OpenCVのガウスフィルタアルゴリズムの仕事はどのようにあります
質問
私は自分のガウスフィルタを作成するが、それは本当に遅いです。
OpenCVのガウスのアルゴリズムは非常に速く、私のガウスフィルタよりも20倍です。 私は私のプロジェクトでのOpenCVのガウスのアルゴリズムを書き換えたい、と私は私のプロジェクトでOpenCVのを含める必要はありません。
ただし、
誰も私にアルゴリズム記述、OpenCVののソースコードを与えることができます 理解するにはあまりにも難しいようだ?
解決
ガウスフィルタは、それは非常に簡単にスピードアップすることができますプロパティを持っている:フィルタは独立して、両方の次元で適用することができます。あなたは垂直動作の一次元フィルタを定義し、別の水平方向に動作すると、それらの両方を適用します。これは、二次元に適用される単一のフィルタと同様の効果を奏する。
それ以上に、あなたはおそらく SIMD命令する例えば SSE3は、あなたのプロセッサのために利用可能します。
他のヒント
あなたの質問の後半部分に答えるために、ガウスぼかしは、単純に画像の上にコンボリューションカーネルとして適用される3次元ガウス面です。 ウィキペディアには、アルゴリズム自体に大きな参照を持っていますが、基本的に、あなたは、ガウスの値をとります曲線と正方行列の中にそれを変換し、あなたのイメージ内のすべての単一のピクセルを掛け、例えばます:
Kernel:
[0 1 2 0 0
1 4 6 4 1 X Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]
(あなたのガウス変数に応じて、あなたは異なる結果を得るでしょう、非常に具体的なEQNSがありますが、これは単なるサンプルカーネルであることに注意してください)。
あなたの質問のパフォーマンスの一部に答えるために、このアルゴリズムの全体的な速度は、一定のサイズの画像を想定して、いくつかのことに依存します。画像は、N×Mのピクセルで、コンボリューションカーネルがPXPピクセルであると言うことができます。あなたはP P のN * Mの操作を実行する必要があるとしています。 Pが大きいほど、より多くの操作は、あなたは、与えられたイメージのために行う必要があるとしています。あなたは非常に特定の行または柱状に基づく数学をやって、ここで使用するアルゴリズムで狡猾取得することができます。
実装も非常に重要です。あなたは非常に効率的になりたい場合は、おそらくあなたのアーキテクチャが提供しています最も先進的な命令を使用することをお勧めします。あなたはインテルのx86チップを使用している場合は、おそらくインテルパフォーマンス・プリミティブ(IPP)のライセンスを取得し、直接それらの命令を呼び出して見たいと思うでしょう。 IIRCは、OpenCVのは、IPPを利用していたときに、その利用可能な...
また、非常にスマートな何かをし、あなたの特定のアーキテクチャ上の浮動小数点性能が悪い場合、すべてのスケールの整数で仕事ができます。これはおそらく、少し物事をスピードアップするだろうが、私が最初にこの道を下って行く前に、他のオプションになります。
ここをチェックしてみます。その後、イメージとそれを畳み込む、事前に個別のガウス行列を把握したい。
は、お使いのコンボリューションカーネルが比較的大きい場合、あなたはOpenCVのは、高速フーリエ変換(FFT)を使用してコンボリューションを実施しているので、パフォーマンスの違いがあることがあります。
直接の畳み込みを実施しています私は、杓子定規であることを嫌い、しかし、あなたは、タスクを達成するために必要な手順の正確な配列であるアルゴリズムを求めています。あなたは既にガウスのアルゴリズムを持っています。だからあなたの質問の重要なポイントは、あなたがアルゴリズムを尋ねると同じではありませんこれは、何かの高速化のために要求したときです。
の高速化の質問に答えるために - あなたはOpenCVのは、高度な技術と幅広い対象であるそのコードを、最適化方法を知りたいです。私はそれは、アセンブリ言語、およびGPU固有の機能を使用していますと言って推測をハザードます。私は、アセンブリを学び、そしてあなたのGPUを活用するためにCUDAパッケージを研究することから始めると思います。