【问题标题】:How to do a custom 2D Kernel on Filter2D using 1D gaussian kernel如何使用 1D 高斯内核在 Filter2D 上执行自定义 2D 内核
【发布时间】:2017-10-18 06:17:38
【问题描述】:

我正在尝试在我的图像上复制过滤器序列,为此我需要创建包含 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 Kernel 作为结果,所以我可以在我的图像中应用这个 kernel(mResultKernel),如下所示:

filter2D(src, resultO, src.depth(), mResultKernel, Point(-1, -1), 0, BORDER_DEFAULT);

我的问题是我创建的这个内核没有给我与按顺序执行 gaussianBlur 和 filter2D 相同的结果。我真的需要遵循这种方法,对我的图像进行卷积并仅使用一个 2D 内核应用 filter2D 函数,就像我在上面展示的那样。

【问题讨论】:

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


    【解决方案1】:

    您混淆了乘法和卷积。您可以使用过滤器 h(x) 改变两个序列过滤器 f(x)g(x) 通过这个公式: h(x) = f(x) * g(x) 其中 * 是卷积算子。矩阵卷积可以参考this lecture

    【讨论】:

    • 感谢参考,不过我已经用filter2D对图像进行卷积了,我只需要生成内核。这就是我的问题。
    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2020-01-31
    • 2013-02-26
    • 2020-03-15
    • 2012-02-19
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多