5

私は自分のガウスフィルターを書いていますが、それは本当に遅いです。

OpenCVのガウスアルゴリズムははるかに高速で、私のガウスフィルターよりも20倍高速です。プロジェクトでOpenCVのガウスアルゴリズムを書き直したいのですが、プロジェクトにopencvを含めたくありません。

でも、

誰かが私にアルゴリズムの説明を教えてもらえますか、opencvのソースコードは理解するのが難しすぎるようです?

4

5 に答える 5

13

ガウス フィルターには、高速化を非常に簡単にする特性があります。フィルターは、両方の次元に個別に適用できます。垂直方向に動作する 1 次元フィルターと水平方向に動作する別のフィルターを定義し、両方を適用します。これにより、2 次元で適用された単一のフィルターと同じ効果が得られます。

それ以上に、プロセッサで利用可能なSSE3などのSIMD 命令を確認する必要があるでしょう。

于 2009-06-01T05:09:12.023 に答える
4

質問の2番目の部分に答えるために、ガウスぼかしは、画像に畳み込みカーネルとして適用される単純な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]

(これは単なるサンプル カーネルであることに注意してください。Gaussian 変数に応じて異なる結果が得られる非常に特殊な eqns があります)

質問のパフォーマンスの部分に答えるために、このアルゴリズムの全体的な速度は、一定のサイズの画像を想定すると、いくつかのことに依存します。画像が NxM ピクセルで、畳み込みカーネルが PxP ピクセルであるとします。P P N*M の操作を行う必要があります。P が大きいほど、特定の画像に対して実行する必要がある操作が多くなります。ここで使用するアルゴリズムを巧妙に利用して、非常に具体的な行または列ベースの計算を行うことができます。

実装も非常に重要です。非常に効率的になりたい場合は、アーキテクチャが提供する最も高度な命令を使用することをお勧めします。Intel x86 チップを使用している場合は、Intel パフォーマンス プリミティブ (IPP) のライセンスを取得し、それらの命令を直接呼び出す方法を検討することをお勧めします。IIRC、OpenCV は、利用可能な場合に IPP を利用します...

また、特定のアーキテクチャで浮動小数点のパフォーマンスが低い場合は、非常にスマートにスケーリングされたすべての整数を処理することもできます。これはおそらく少しスピードアップしますが、この道を進む前に、まず他のオプションを検討します.

于 2009-06-01T04:46:49.447 に答える
2

ここで確認してみてください。事前に離散ガウス行列を計算し、それを画像と畳み込みます。

于 2009-06-01T04:47:52.830 に答える
1

畳み込みカーネルが比較的大きく、直接畳み込みを実装している場合、パフォーマンスの違いは、OpenCV が高速フーリエ変換 (FFT) を使用して畳み込みを実装していることが原因である可能性があります。

于 2009-06-01T05:12:14.767 に答える
-1

衒学的なことは言いたくないのですが、あなたが求めているのはアルゴリズム、つまりタスクを達成するために必要な正確な一連のステップです。すでにガウス アルゴリズムを使用しています。したがって、質問の重要なポイントは、アルゴリズムを求めることとは異なり、 より高速なものを求める場合です。

より迅速な質問に答えるには、OpenCV がそのコードをどのように最適化するかを知りたいと考えていますが、これは非常に技術的で幅広いテーマです。アセンブリ言語と GPU 固有の関数を使用していると言って推測するのは危険です。アセンブリを学習し、GPU を活用するために CUDA パッケージを調査することから始めます。

于 2012-12-19T23:58:48.167 に答える