5

私の質問は簡単です。単純すぎるかもしれません。しかし、私のプロジェクトの1つで作業しているときに、次の行を使用してバイナリイメージを拡張しました。

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2);

これは基本的に、3x3の長方形の構造化要素でバイナリイメージを拡張しています。最後の引数から、この操作を2回繰り返して実行していることがわかります。これは、次と同等です。

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1);
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1);

私の質問はこれです:2回の反復を実行する代わりに、6x6の構造化要素を使用して1回の反復のみを実行する場合、これは精度とパフォーマンスの点で上記のコードと同等ですか?画像が1回だけ繰り返されるので、高速ですか?

4

2 に答える 2

6

同じカーネルでの拡張は、2つの畳み込み演算で表すことができます。

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 

畳み込みの特性により、この操作は次のようになります。

"YourImage" convolve ( "DilationKernel" convolve "DilationKernel")

3x3カーネルとそれ自体の畳み込みは、5x5行列になるため、6x6の仮定は間違っています。

パフォーマンスに関しては、考慮すべきことがたくさんあります。私の以前のインターンシップでは、大きなカーネルのパフォーマンスが低下するため、できるだけ小さなカーネルを使用することを目指しています。経験則では、小さなカーネルは、L1またはL2キャッシュにアクセスせずに、CPUレジスタを使用してそれらを保存および取得できるため、イメージに対してより高速に動作します。また、カーネルがレジスタに収まる場合は、SSE命令を簡単に使用できます。

畳み込みの並列化は別の話であり、私はそれについて多くの実用的な情報を持っていません。したがって、並列化された実装を使用する場合、この経験的事実がまだ当てはまるかどうかはわかりません。

于 2012-08-29T06:43:32.637 に答える
0

自分でパフォーマンスを測定する必要がありますが、6x6要素を使用した1回の拡張の方が速いはずです。ウィキペディアは、バイナリ拡張は連想的であると述べています。これは、別のそのような長方形で拡張された3x3の長方形が6x6の長方形を与える場合、実際に3x3による2つの拡張は、6x6による1つの拡張と同等であることを意味します。

于 2012-08-29T06:24:15.273 に答える