2017-10-18 134 views
1

我想在我的映像上复制过滤器序列,为此我需要创建包含Filter2D内核和高斯内核的内核。通常我们应用高斯滤波器,然后应用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内核。我试图乘以这两个内核来获得相同的结果,如上面的代码。

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 X kernelSize内核结果,于是我可以在我的图像应用此内核(mResultKernel),像这样:

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

我的问题是我创建的这个内核并没有给我提供和连续执行gaussianBlur和filter2D相同的结果。我真的需要按照这种方法来卷积我的图像,并使用一个2D内核来应用filter2D函数,就像我上面所展示的那样。

回答

0

你在乘法和卷积之间混淆不清。你可以使用一个过滤器h(x) alter对于两个序列过滤器f(x)g(x)通过下面的公式: h(x) = f(x) * g(x)其中*是卷积算子。对于矩阵卷积,您可以参考this lecture

+0

感谢您的参考,但我已经使用filter2D来卷积图像,我只需要生成内核。这就是我的问题。 –