我正在尝试在我的图像上复制过滤器序列,为此我需要创建包含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函数,就像我上面所示。
答案 0 :(得分:0)
你在乘法和卷积之间混淆了。您可以使用过滤器h(x)
更改为两个序列过滤器f(x)
和g(x)
这个fomular:
h(x) = f(x) * g(x)
*是卷积运算符。对于矩阵卷积,您可以参考this lecture。