我不知道如何正确使用 sepFilter2D。我对 OpenCV sepFilter2D 函数中使用 kernelX、kernelY 等函数参数感到困惑。
vector<double> filter1; //row vector
sepFilter2D(src, convolvedImg, CV_64FC3, filter1, filter1, Point(-1, -1), 0.0, BORDER_DEFAULT);
//filter1 = [0.00443305 0.0540056 0.242036 0.39905 0.242036 0.0540056 0.00443305]
您可能知道,卷积运算在图像处理中被广泛使用。它涉及使用 2D 过滤器,通常尺寸较小(例如 3x3 或 5x5),简短的解释是您将过滤器叠加到每个位置,将过滤器中的值与图像中的值相乘,然后将所有内容加在一起。在维基百科页面更详细的在介绍这一操作。
只是为了对此有所了解,假设您有一个 MxN 图像和一个 UxV 过滤器。对于每个像素,您必须应用过滤器一次。因此,您必须执行 M N U*V 乘法和加法。
一些过滤器有一个很好的特性,称为可分离性。您可以通过应用一次大小为 V 的水平过滤器然后应用大小为 U 的垂直过滤器来实现 UxV 2D 过滤器的相同效果。现在您有 M N U + M N V = M N (U+V) 操作,因此这样效率更高。
这sepFilter2D
正是这样做的:应用垂直和水平一维过滤器。完整的函数签名是:
void sepFilter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernelX, InputArray kernelY, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )
,其中src
是您的初始图像,过滤后的图像将在dst
,ddepth
代表目标图像的所需类型,kernelX
并且kernelY
是我上面描述的水平和垂直一维内核,anchor
代表内核原点(默认表示中心),delta
代表一个值添加到目标图像以抵消其亮度并borderType
表示在边框周围使用的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句