图像卷积运算函数filter2D()

转载 2018年04月17日 21:55:38

filter2D()函数是OpenCV中进行图像卷积运算的函数,能够自己设定卷积核。通常被用来在进行滤波时,自己设定滤波器,但是在其他很多时候,也可以使用这个函数进行卷积滤波,如亚像素边缘提取过程中,可以将算出的Zernike矩与图像进行卷积运算,进行之后的处理,但是要清除卷积是为了什么进行卷积。

函数定义为:

CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor=Point(-1,-1),
                            double delta=0, int borderType=BORDER_DEFAULT );

函数原理为:

1. 首先把边界预先处理,然后再处理非边界部分(防止溢出)

2. 每行处理dst图像,而src的指针加1,这里为什么是src++呢?实际上这里src保留的是源数据的每行首地址

3. 对于5*5的核来说,k_ptr实际上保留了与src有关的25个指针地址,分别对应kernel里面的每一项。这25个指针地址,也只是src的每行的首地址。

所以后面使用的时候,sptr = (*kp++) + i;其中kp就是这个首地址,偏置为i。k_ptr里面的每个值都是一个源图的图像数据地址。

也就是说,OpenCV在计算每个核的时候,首先把与dst每个像素对应的那个源数据区域所用的像素点地址计算出来了,这对于Sparse的核来说非常重要。另外,当核很大时,这样事先计算出地址的方法也能提高cache的概率。

4. 在while循环里面实现这个线性核的所有计算,比如,5*5的核,25个乘法和25个加法。kc表示核系数的首地址。


该函数使用于任意线性滤波器的图像,支持就地操作。当其中心移动到图像外,函数可以根据指定的边界模式进行插值运算。函数实质上是计算kernel与图像的相关性而不是卷积: 
这里写图片描述 
也就是说kernel并不是中心点的镜像,如果需要一个正真的卷积,使用函数flip()并将中心点设置为(kernel.cols - anchor.x - 1, kernel.rows - anchor.y -1). 
该函数在大核(11x11或更大)的情况下使用基于DFT的算法,而在小核情况下使用直接算法(使用createLinearFilter()检索得到). 


参数含义如下:

InputArray src: 输入图像

OutputArray dst: 输出图像,和输入图像具有相同的尺寸和通道数量

int ddepth: 目标图像深度,如果没写将生成与原图像深度相同的图像。原图像和目标图像支持的图像深度如下:

    src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
    src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
    src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
    src.depth() = CV_64F, ddepth = -1/CV_64F
  • 1
  • 2
  • 3
  • 4
  • 5

当ddepth输入值为-1时,目标图像和原图像深度保持一致。

InputArray kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。如果想在图像不同的通道使用不同的kernel,可以先使用split()函数将图像通道事先分开。

Point anchor: 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。

double delta: 在储存目标图像前可选的添加到像素的值,默认值为0

int borderType: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。




opencv学习(七)之图像卷积运算函数filter2D()

在其官方文档中,filter2D()函数在掩模板介绍中一笔带过,我认为该函数应该进行详细介绍。 对于使用掩模板矩阵(kernel)计算每个像素值,结合函数filter2D()函数,其定义如下:CV_...
  • keith_bb
  • keith_bb
  • 2016-11-09 18:08:36
  • 11265

opencv学习笔记(二十)cvFilter2D()卷积以及卷积边界的处理

20.1**cvFilter2D()卷积:**void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* ...
  • u014751607
  • u014751607
  • 2017-01-08 15:38:19
  • 8905

对图像像素的高效操作(卷积filter2D)

接上篇文章:对图像每个像素操作
  • littleThink
  • littleThink
  • 2014-08-19 10:38:02
  • 859

filter2D图像卷积

原文链接:1.Filter是一个非常耗时的操作,不过OpenCV的Filter写法比较特别这里把原理解析一下,就可以编写自己的filter代码了OpenCV的Filter2D代码解析2.下面这篇是对官...
  • weixin_36340947
  • weixin_36340947
  • 2017-07-28 15:16:38
  • 254

图像变换 - 卷积(cvFilter2D)

最常见的图像变换(image transform,即将一幅图像转变成图像数据)就是傅里叶变换(Fourier transform),即将图像转换成源图像数据的另一种表示,而卷积是大多数变换的基础。 ...
  • jackinzhou
  • jackinzhou
  • 2012-08-23 16:49:04
  • 5861

opencv中卷积函数cvFilter2D

1:cvFilter2D相关介绍可参考
  • smallstones
  • smallstones
  • 2014-11-24 20:09:18
  • 1314

卷积运算函数filter2D()

CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,InputArray kernel, Point anc...
  • sjtudou
  • sjtudou
  • 2018-01-18 16:02:57
  • 43

Python实现图像卷积操作

图像或者深度学习的卷积操作原理待更新.......... 先贴出实验code和效果: #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Crea...
  • OliverkingLi
  • OliverkingLi
  • 2018-02-02 22:30:38
  • 202

OPENCV图像卷积运算

先来了解卷积的概念与作用(转自网络): Filter2D 对图像做卷积 void cvFilter2D( const CvArr* src, CvArr* dst, ...
  • he_haiqiang
  • he_haiqiang
  • 2012-04-18 20:23:56
  • 6207

图像处理之卷积和积分运算

先看到卷积运算,知道了卷积就是把模版与图像对应点相乘再相加,把最后的结果代替模版中心点的值的一种运算。但是,近来又看到了积分图像的定义,立马晕菜,于是整理一番,追根溯源一下吧。 1 卷积图像 1....
  • sunlightli1216
  • sunlightli1216
  • 2016-01-12 09:34:02
  • 3449
收藏助手
不良信息举报
您举报文章:图像卷积运算函数filter2D()
举报原因:
原因补充:

(最多只允许输入30个字)