如何使用1D高斯内核在Filter2D上执行自定义2D内核
问题描述:
我想在我的映像上复制过滤器序列,为此我需要创建包含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函数,就像我上面所展示的那样。
答
你在乘法和卷积之间混淆不清。你可以使用一个过滤器h(x)
alter对于两个序列过滤器f(x)
和g(x)
通过下面的公式: h(x) = f(x) * g(x)
其中*是卷积算子。对于矩阵卷积,您可以参考this lecture。
感谢您的参考,但我已经使用filter2D来卷积图像,我只需要生成内核。这就是我的问题。 –