OpenCV从入门到放弃(八):空间滤波与边缘检测

来源:互联网 发布:冰与火感动知乎 编辑:程序博客网 时间:2024/05/07 05:48

一.几个概念

Ⅰ.滤波器基本原理

在冈萨雷斯的《数字图像处理》中这么说:空间滤波器(filter)一般由两个部分组成:

  • 一个邻域(矩形)
  • 对该邻域包围的图像的像素执行的预定义的操作

那上面这段话是什么意思呢?现在什么都不管先直接举一个例子.
这里写图片描述
上面的矩形并不是一个严格的图片,只是用一个矩形来举例子. 我们可以把最左边的看做是原图,中间那个是是滤波器,最右边那个是结果.
这个例子的运行方式就是方框从左上角开始,把所有的像素计算一次,得到一个结果.然后整体向右移动一格,在计算在这个滤波器下面的所有元素产生的结果.右边不能够再移动之后,就回到最左边并且向下移动一个.直到最后到图中绿色部分所示.
看绿色的部分就知道这个filte每次”统治”的位置了.事实上,计算规则也是极度简单的,就是7*1+8*1+9*2+10*1+12*1+......=314,本质就是两个部分矩形中对应位置元素相乘然后把这些元素加起来就得到了结果。是不是非常简单?
说到这里,再来看刚刚上面对于空间滤波器的那两个部分:
- 一个邻域:其实就是上面例子中间那个4*4的方框.
- 对该领域包围的图像执行的操作:其实就是4*4方框里面的内容.也就是说,方框中内容的不同,我们就会得到不同的结果.

通常,我们也把滤波器叫做,核(kernel),模板(template),或者窗口(window),以后碰到这些要分的清楚.
现在再回到理论,也就是说,通过滤波器,会产生新的像素和图像,一般来说有两种滤波器:
- 线性滤波器:在图像像素上面执行的是线性操作.
- 非线性滤波器:在图像像素上面执行的是非线性操作.

把上面那个搞得理论一点.使用m×n的滤波器对大小为M×N的图像进行线性空间滤波可以由下面的式子表示,
这里写图片描述
这里写图片描述
其中g(x,y)是新的图像,f(x,y)是原图.

Ⅱ.相关和卷积

Ⅲ.图像导数/微分

本来图像的微分内容应该是在前面讲的,但是在这里讲能够让内容更加连贯,因此就放在这里了。
图像的导数不用我说你也知道有多么重要了吧,很多的边缘检测算法,都是通过检测某处是否有像素值的突变来检测边缘特征。而这其中导数的性质就很重要了。一般刚开始学的时候对于图像的导数都是输入懵逼的概念。其实,都是纸老虎,很简单的。
首先还是回顾一下对于一幅图像的定义。极度通俗的来说,对于数字图像,我们可以看作是一个基于位置(x,y)两个变量函数.所以,对于一个M×N的图像,一幅图像可以表示为
这里写图片描述

一阶导数:

对于图像f(x,y),用差分来近似的代替导数.那么在点(i,j)处沿x方向和y方向的导数可以写为
这里写图片描述
(这个时候你会想,那么最右边那列和最下边那行的像素梯度无法得到,一般用前一行和前一列的来近似表示.)

二阶导数:

二阶导数的推导就是建立在一阶导数的基础上面了.下面给出完整的推导和结论.
这里写图片描述
上面面的式子是以点(i+1,j)为中心,把i+1换为i,得到
这里写图片描述
同理,有
这里写图片描述

二.常用平滑滤波

平滑也被称为模糊.是低频增强的空间滤波技术.平滑滤波器用于模糊处理降低噪声,通常用于预处理的任务里面.

Ⅰ.平滑线性滤波器

平滑线性滤波器的输出是包含在滤波器模板邻域中的像素的平均值.用滤波器模板确定的邻域内像素的平均灰度值代替图像中的每个像素的值.(通常也叫作均值滤波器),可以归入低通滤波器.
因为平滑线性滤波器的特点,他能够降低图像灰度强烈的变化.一般的随机噪声也是由灰度的急剧变化组成,因此,也起到了降低噪声的作用.
说了那么多,接下来说说典型的平滑线性滤波器.

1.方框滤波(Box filter)

也叫作盒状滤波器(翻译不同),我们把一个核(你现在应该能够知道核是什么意思)中所有的元素(系数)都相同的均值滤波器叫做方框滤波器.一般来说,我们习惯于所有的元素都取1.
直观的来说,可以写成:
这里写图片描述
其中的α表示归一化常数.至于滤波过程上面也提到了,整个滤波器扫一下原图,产生出新的像素值,然后原图中方框方位内像素值都替换为新的像素值.而且由于这里滤波器的内容都是1,通过最开始对于滤波器运行原理的解释,你可以知道这个滤波器就是把滤波器下面的内容加起来然后求平均值.
说完了原理说实战的东西.
官方文档:
http://docs.opencv.org/3.1.0/d4/d86/group__imgproc__filter.html#gad533230ebf2d42509547d514f7d3fbc3
在OpenCV中,提供了方框滤波的函数,boxFilter()
原型:

void cv::boxFilter ( InputArray  src,        OutputArray  dst,        int  ddepth,        Size  ksize,        Point  anchor = Point(-1,-1),        bool  normalize = true,        int  borderType = BORDER_DEFAULT     )       

作用:
方框滤波来平滑(模糊)一幅图像.采用的模板(核)就是上面说的那个.其中有一个要注意的就是α系数的多少.有下面的规则:
这里写图片描述

三.常用的锐化滤波

锐化处理主要是突出灰度的过渡部分.而图像锐化主要是用通过空间图像的微分来实现.(参照上面的图像的导数和微分.)核心思想就是微分能够增强边缘和其他突变(噪声等等),削弱灰度变化缓慢的区域.
锐化的一个很重要的使用场景就是用来提取边缘了.接下来要讲的也就是主要讲一些提取边缘的算子.

Ⅰ.一阶微分锐化算子

前面已经讲过一阶微分的概念了,没有看到的可以到前面看一下复习一下。图像中的一阶微分使用梯度幅值来实现的。首先来看梯度。梯度的概念在多元函数中就已经接触到了,很简单。这里复习一下。
假设有多元函数f为n元变量函数。那么他的梯度可以定义为:
这里写图片描述
而梯度的意义就是这个位置梯度的方向就是函数最大变化率的方向。比如机器学习里面梯度下降也是取梯度方向来做最快的迭代….
在图像中,一般是一个基于位置(x,y)二元函数,那么可以简化为
这里写图片描述

1 0