c++ - 如何使用 1D 高斯内核在 Filter2D 上执行自定义 2D 内核

标签 c++ opencv image-processing kernel filtering

我正在尝试在我的图像上复制过滤器序列,为此我需要创建包含 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/

相关文章:

java - 如何在 Mat 对象中插入一条线或矩形(openCV)

python - 在 OpenCV (Python) 中裁剪具有校正失真的图像

java - 如何在java中创建带有嵌入颜色表和像素颜色索引的双层(深度=1)位图文件?

c++ - 类中的嵌套类或结构

c++ - boost.serialization 并替换现有的序列化 std::wstring 的方法

c++ - 指针和非指针类型的重载 -> 运算符

pandas - 将多维数组元素转换为相同数量的数组

c++ - 如何在 eclipse makefile 项目的编译器选项中设置 -std=c++0x?

c++ - 如何获取 3d 维数组并将其转换为模型?

c - 在c中水平翻转BMP图像