主要内容:函数
一、图像的表示
spa
图像是由一个个的像素表示的,一个图像的像素点能够用 (x,y) 来表示位置,v来表示像素值(灰度图像的话表示一个0~255的值),所以整个图像的表示就是 {(x,y,v)} 像素点的集合。我在以前看不少图像处理的书,基本都是这样介绍的,可是CMU的课件上提出了一个我认为特别好的介绍,是把图像做为一个函数来介绍,f(x,y)=v,函数的自变量为像素点位置,函数值为像素值,画出来的函数图像以下(它把不一样的像素值赋予了对应的颜色)。这个表示对后续的边缘检测、特征点获取理解帮助很大。
.net
图像的变换基本有两个方面,一是不改变大小,改变像素点的值(即改变函数f(x,y)的值),这个操做是基于像素点的(CMU课件2.0_Point_Processing这一节对此举了很多例子 )。第二种是改变大小和像素值,这种操做通常能够改为描述为两部,第一步更改特定像素的值,第二步,在集合中删除掉部分像素点。(好比高斯图像金字塔)code
二、高斯滤波对象
为何须要滤波?个人理解是使图像更平滑(或者说更模糊),同时去除掉了一些噪声的干扰,为何能够作到这样,个人理解是滤波本质上至关于把一个像素的值,跟他周围的像素值紧密联系起来,那么一个干扰点会把他的干扰分散到周围像素上,干扰强度缩小,而其自己受周围像素影响,包含了周围像素的特征,干扰强度更是大大减少,所以干扰项便不存在。blog
OK,CMU的课件上来说了一个均值滤波的例子(CMU课件2.0_Box_Filter)。均值滤波的滤波器是左下这种样子的,滤波操做的公式
图片
滤波操做的基本公式以下:h[m,n]是通过滤波操做以后,(m,n)位置处的像素值,至关于f(m+k,n+l)*g(k,l)的和,k,l是滤波器的大小,g(0,0)是中心位置。均值滤波其实就是把每一个像素值,变成已它为中心,绘制1个3*3的矩形,矩形内的全部像素值的平均值。
ci
除了均值滤波,还有中值滤波比较常见(CMU课件上没写),并且我以前应用比较多,对其很有好感,中值滤波的原理其实根均值滤波同样,画一个矩阵,可是中值滤波中取的的是像素的中位数,这其实更适合去噪,由于咱们噪声通常都是像素值比周围突出的点(这样咱们人眼才能看出来他是噪声,若是隐藏在周围像素点,隐藏的比较好,那就不是噪声了),这样中值化后,它就不存在了。而后就是CMU课件中疯狂介绍的高斯滤波。博客
为何是高斯滤波?首先须要明白高斯分布,高中和本科数学都学过正态分布,高斯分布其实就是正态分布,那么正态分布当初的那些性质就适合高斯分布(关于正态分布和高斯分布的介绍请移步 http://blog.csdn.net/rns521/article/details/6953591)。经过上面的介绍,其实滤波操做就是对像素进行取周围全部像素的加权和,根据经验咱们知道距离该像素点越远的点对当前像素影响越小,可是不管中值滤波仍是均值滤波均没考虑才到这一点,而一维高斯分布值是经过终将向两端不断减小的,二维高斯分布是向四面八方递减,那么把高斯分布做为滤波器,就能够实现不一样距离的像素点的影响不一样这一目的。下图左边是二维高斯分布,右边是一维高斯分布(两张图片来源于下述博客,此外关于高斯滤波的滤波矩阵推导见 http://blog.csdn.net/lonelyrains/article/details/46463987)。数学
那么高斯滤波有什么做用呢?CMU的课件给出了一个特别有意思的例子,就是去实现一个简单的移轴摄影,就是怎么样把左边的图像变成右边的图像。其实很简单,把第二幅图像中跟第一幅图像同样清晰的像素块取出来,加上第一幅图像中剩余的像素点,作一次高斯滤波。
课件上给出的解决方案:
三、图像金字塔
提出图像金字塔的主要目的是为了压缩图像。好比把一个图像压缩到1/2,能够怎么办?
高斯金字塔解决方案:一、将原图作一次高斯滤波 二、把作完高斯滤波图像的全部偶数行列全去掉。
整个方法看上去很不错,可是存在一个问题,怎么还原?咱们先复原大小(位置值先用0表示,而后再作一次相似逆滤波的操做),可是这个时候还原回去以后,数据会存在偏差。Laplacian金字塔就是把偏差保存下来——实际上是每次高斯滤波以后丢弃的数据。用代码去实现整个压缩过程以下:
for i from 0 to sacle: li=blur(fi) #对图像fi作一次滤波 hi=li-fi #保存丢失信息,Laplacian金字塔 fi+1=subSample(li) #更改图像大小 ######复原代码 for i for scale to 0: li=unSample(fi) #大小复原 fi+1=li+hi #加上偏差
四、边缘检测
什么是边缘?从图像上来讲是像素值的分解线,从第一小节中的二维函数图像中来看,就是周围函数值发生忽然变化的像素点就是边缘。这样目的就明确了,找到附近函数值变化比较大的点,高中学的导数的定义就是函数的变化率,导数大的地方函数值变化大。问题在于图像函数是没法用表达式表达出来,所以不能用既定的求导公式去计算,在高等数学的极限和中学数学中,咱们学过用下面这个公示去近似导数
CMU的课件(4.0_Image_Gradients_And_Gradient_Filtering)中列出了下面的一个例子,假设下面这一行数据是某个图像中的x方向一行的像素值,利用近似导数的方法求某个像素点附件的x导数,其实至关于乘以了右侧的过滤器。假设成了多个过滤器,即跟X在同一列上的相邻像素的近似梯度值,这样,若是这个梯度值比较大,其实就至关于这块有一条近似垂直的边界线(y方向)。
图像都是二维的,所以求x方向梯度值大的求出来都是近似垂直的边界,同时须要再利用一样的方法在求一遍y方向的梯度值变化,最后把梯度值转换成灰度值。这就是Sobel算子的原理
在CMU的课件中,还提到了一点,固然也是实际应用中很是重要的一点,Sobel算子对噪声比教敏感,所以须要在处理以前进行去噪(高斯滤波等)。
在介绍完Sobel算子以后,CMU的课件又介绍了Laplace过滤器。Laplace的原理在于求像素点的二阶导数(其实是二阶梯度,表达式没有,二阶导数求不出来o(╯□╰)o),二阶导数是对一阶导数求导的结果,二阶导数为0,意味着一阶导数再次取到了极值,一阶导数表示灰度值的变换状况,一阶导数取到了极值,也就是说原图在此灰度值变换巨大。下图是截取自CMU课件中关于Laplace过滤器推倒的过程。
下面这张图展现了图像通过Sobel算子和Laplace过滤器以后的不一样,能够看到利用Laplace过滤器的中间为0的这个特性,能够更好的定位边缘。