【发布时间】: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