我正在尝试在我的图像上复制过滤器序列,为此我需要创建包含 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 创建一维内核。我试图将这两个内核相乘以获得与上面的代码相同的结果。
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)
改变两个序列过滤器 f(x)
和 g(x)
通过这个公式:
h(x) = f(x) * g(x)
其中 * 是卷积运算符。矩阵卷积可以引用this lecture .
关于c++ - 如何使用 1D 高斯内核在 Filter2D 上执行自定义 2D 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46803894/