2017-10-18 4 views
1

私はイメージのフィルタのシーケンスを複製しようとしています。このためには、Filter2Dカーネルとガウスカーネルを含むカーネルを作成する必要があります。通常はgaussianBlurを適用し、次にfilter2Dを適用します。このため一般的なコマンドは次のとおりです。1Dガウスカーネルを使用してFilter2Dでカスタム2Dカーネルを行う方法

kernel2D= Mat::ones(kernelSize, kernelSize, CV_32F) *(1/(float)(kernelSize*kernelSize)), Point(-1, -1); 
GaussianBlur(src, resultO, Size(kernelSize, kernelSize), sigma); 
filter2D(resultO, resultO, resultO.depth(), kernel2D, Point(-1, -1),0,BORDER_DEFAULT); 

だから、最初に私はマット::ものを使用してgetGaussianKernel方法、および1Dカーネルを使用して、ガウスカーネルを作成します。私は上記のコードと同じ結果を得るために、この2つのカーネルを多重化しようとしています。私はこのプロセスを行うと

sigma = 0; 
    Mat mKernelGauss1 = getGaussianKernel(kernelSize, sigma, CV_32F); 
    mKernel2D = Mat::ones(1, kernelSize, CV_32F) *(1/(float)(1*kernelSize)), Point(-1, -1); 
    mResultKernel = mKernelGauss1 * mKernel2D; 

、このように、私はkernelSizeが、結果としてkernelSizeカーネルのxは取得、それでは私は私のイメージでは、このカーネル(mResultKernel)を適用することができます。

filter2D(src, resultO, src.depth(), mResultKernel, Point(-1, -1), 0, BORDER_DEFAULT); 

私の問題があります私が作成するこのカーネルは、gaussianBlurとfilter2Dを連続して実行するのと同じ結果を私に与えません。上記のように、私のイメージを畳み込み、1つの2Dカーネルだけを使ってfilter2D関数を適用するには、このメソッドに従う必要があります。

答えて

0

あなたは乗算とコンボリューションの間で混乱しています。 2つのシーケンスフィルタf(x)g(x)に対してフィルタh(x)をこのフラムによって変更することができます。 h(x) = f(x) * g(x) *は畳み込み演算子です。行列畳み込みについては、this lectureを参照してください。

+0

参考にしていただきありがとうございますが、私は既にfilter2Dを使用して画像を畳み込んでいます。カーネルを生成するだけです。それが私の問題です。 –

関連する問題