如何使用1D高斯内核在Filter2D上进行自定义2D内核

时间:2017-10-18 06:17:39

标签: c++ opencv image-processing kernel filtering

我正在尝试在我的图像上复制过滤器序列,为此我需要创建包含Filter2D内核和高斯内核的内核。通常我们应用gaussianBlur然后应用filter2D。常见的命令是:

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方法创建高斯内核,使用Mat :: Ones创建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函数,就像我上面所示。

1 个答案:

答案 0 :(得分:0)

你在乘法和卷积之间混淆了。您可以使用过滤器h(x)更改为两个序列过滤器f(x)g(x)这个fomular: h(x) = f(x) * g(x) *是卷积运算符。对于矩阵卷积,您可以参考this lecture

相关问题