迄今为止,看到的函数中,卷积的操作发生在OpenCV函数的内部。理论上,图像卷积就是将内核与图像覆盖区域对应位置相乘之后求和。从调用函数上来看,它需要一个数组参数来描述内核。在实践层面,有一个重要的微妙因素会对结果产生重大影响。微妙之处在于一些内核是可分离的,而另一些则不是。
![ee8568ef8e98c0619796960ccbd0a901.png](https://i-blog.csdnimg.cn/blog_migrate/d72c80fa95c9bc9e3cc72ce59643cfe2.png)
图1(A)是可分离的; 它可以表示为两个一维卷积(B和C);D是一个不可分割内核的例子。可分离的内核是可以被认为是两个一维内核的内核,首先与x内核进行卷积然后与y内核进行卷积来应用。这种分解的好处是内核卷积的计算成本大约是图像面积乘以内核区域。这意味着用n×n内核卷积区域A的图像需要时间与An2成正比,同时n×1内核与图像卷积一次,然后与1×n内核卷积占用与An + An = 2An成比例。即使n小于3也有好处,随着n的增长,优势更为突出。
1、 利用filter2D()滤波
鉴于图像卷积所需的操作次数,是图像中像素的数量乘以内核中的像素数,这可能需要很多计算,因此,在这种情况下,最好让OpenCV来帮你完成并利用内部优化。OpenCV完成这些操作的函数是filter2D():
cv::filter2D(
cv::InputArray src,
cv::OutputArray dst,