OpenCV下利用傅里叶变换和逆变换实现图像卷积算法,并附自己对于卷积核/模板核算子的理解!

来源:互联网 发布:淘宝博库图书专营店 编辑:程序博客网 时间:2024/06/14 13:02

学过信号与系统的人都知道,卷积运算一般是转化成频率乘积再求逆来计算,因为这样可以减少计算量,提高代码的效率。【2016-6-21日注:其实一般还是用卷积的算法,详情博文http://blog.csdn.net/wenhao_ir/article/details/51699064中对高斯滤波的说明】

图像卷积操作广泛应用在图像滤波技术中。

图像卷积运算中一个重要概念是卷积核算子,它是模板核算子的一种,模板核算子实际上就是一个窗口矩阵,用这个窗口按像素点滑动去计算目标图像的新值,这个新值就来源于窗口中包含的像素值按一定的算法计算出的结果。核算子是奇数阶矩阵,通常用3阶矩阵。比如卷积表达式f*g中,核算子就代表着g,所以一旦你的滤波器定了,核算子也就定了,当然,由于核算子矩阵的阶数不同,核算子也会有所不同,不过通常的阶数为3.之所以要取奇数是,是因为通常要取中间点作为被替换值的点,偶数阶的话取不到中间的点,具体的你看下面博文中的运算法则就清楚了。

图像怎么与核算子间进行运算?可以参考博文http://www.cnblogs.com/slysky/archive/2011/11/25/2262899.html(搜“首先离不开的就是卷积核”然后开始看)

在博文http://www.cnblogs.com/slysky/archive/2011/11/25/2262899.html中还给出了常用的低通滤波器、高通滤波器、平移和差分边缘检测、匹配滤配边缘检测 、边缘检测、梯度方向边缘检测的核算子,以后使用的时候可以参考。

从卷积核算子的运算法则上很容易可以看出,以三阶核算子为例,靠近边界的两行和两列的元素是不能作卷积核运算的!(运算法则我上面以博文链接的方式给出)这个问题书面话说就是下面的叙述

当处理图像边界像素时,卷积核与图像使用区域不能匹配,卷积核的中心与边界像素点对应,卷积运算将出现问题。处理办法如下::

A 忽略边界像素,即处理后的图像将丢掉这些像素。
B 保留原边界像素,即copy边界像素到处理后的图像。

PS:在OpenCV的图像平滑的各种滤波算法中,采用的是把原图像进行适当的扩充,即扩大一点来处理这个问题的。详情可以参考我的下下下篇博文。

下面给出实现源码

源码中用到的图像下载链接 http://pan.baidu.com/s/1kUEDw5x

//OpenCV版本2.4.9  //交流QQ2487872782 2016-8-4注:很报歉,此代码目前不能公开发表在博客上,已经删除,希望大家能理解!

运行结果如下图所示


从结果中我们可以看出,代码对原图像实现了低通滤波的效果

-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号2487872782

0 0