还是复现opencv的Gaussblur写成c,首先会获取kernal核,获取kernal核比较简单和matlab一模一样。源码也不贴了。而最关键的是里的卷积问题。假设有MxN的图片,用nxn的卷积核运算,复杂度是要n^2MN次操作;但opencv采用的可分离卷积滤波器sepfilter2D也就是先行卷积,复杂度nMN;再列卷积,复杂度nMN。优化计算速度。这个问题大部分博客都有,关键就是先行卷积时的补齐问题,左边自动补齐的是以下方式。
当行卷积做完后,sepfilter2D再对图片换列卷积,列卷积也是这种镜像方式。
验证,假设3X3的单位矩阵,
然后采用 卷积核[1,2,3]
行卷积后的结果为
再对下图做[1,2,3]列卷积
结果为
和opencv的sepfilter2D一样的结果
大家可以试一下,但是matlab里用所有的imfilter是实现不了的。