C++ 如何使用1D高斯核在Filter2D上实现自定义2D核

C++ 如何使用1D高斯核在Filter2D上实现自定义2D核,c++,opencv,image-processing,kernel,filtering,C++,Opencv,Image Processing,Kernel,Filtering,我试图在我的图像上复制一系列过滤器,为此我需要创建一个内核,它包含Filter2D内核和Gaussian内核。通常我们应用高斯模糊,然后应用滤波器2D。常用命令如下: kernel2D= Mat::ones(kernelSize, kernelSize, CV_32F) *(1 / (float)(kernelSize*kernelSize)), Point(-1, -1); GaussianBlur(src, resultO, Size(kernelSize, kernelSize), sig

我试图在我的图像上复制一系列过滤器,为此我需要创建一个内核,它包含Filter2D内核和Gaussian内核。通常我们应用高斯模糊,然后应用滤波器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方法创建了一个高斯核,并使用Mat::One创建了一维核。我尝试将这两个内核相乘以获得与上面代码相同的结果

    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函数,如我上面所示。

您混淆了乘法和卷积。您可以使用过滤器
h(x)
alter作为双序列过滤器
f(x)
g(x)
,公式如下:
h(x)=f(x)*g(x)
这*是卷积算子。对于矩阵卷积,您可以参考。

您混淆了乘法和卷积。您可以使用过滤器
h(x)
alter作为双序列过滤器
f(x)
g(x)
,公式如下:
h(x)=f(x)*g(x)
这*是卷积算子。对于矩阵卷积,您可以参考。

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