1.滤波以及边缘检测
1)空间滤波以及频域滤波
包括线性和非线性滤波
2)边缘检测
canny,Sobel,Laplace
项目:车牌识别运用到机器学习中的SVM以及NN(Neural network)算法
一.获取的图像
图像包含噪声:
原因:1.源传感器的质量;2.光照变换;;3.量化过程引入噪声.
在图像处理当中把图像复原或者去噪称为图像滤波或者图像复原.这是我们拿到图像之后的第一步操作.受到噪声污染的图像叫做退化,去噪就称为复原.常见噪声为加性噪声(与信号的关系是相加的,不管有没有信号,噪声都是始终存在的)\乘性噪声(由于信道不理想,它与信道的关系是相乘的,信号存在,乘性噪声就存在,反之就不存在).把加性的随机性看成是系统的系统背景噪声,乘性的随机性噪声看成是系统的变性.
二.2D滤波
在一维数据里面有噪声,首先想到的是做滑动平均,假设窗口采用的是5,那么每次都是对要去噪的改数据附近的5个值求平均,然后将平均后的值赋给该值.
在二维里面对其进行展开,同样有一个滑动窗口,比如是3*3的一个二维矩阵窗口,
用这个滑动窗口对原始图像进行滑动滤波,对应位相乘,然后相加,再取平均,赋给中间那个值.注意千万不要在原始图像的基础上进行修改.
其过程如下:
上面的滤波器叫做box filter,但是这样的滤波会有一些水纹或者说图像不是那么平滑有跳跃的感觉,如下
解释一下,在频域里面用的是一个矩形框来滤波,它在频域里面是一个类似于这样的函数
它在高频的时候是有跳跃的,它不是真正的低通滤波器.在某些高频的时候是可以通过的.
下面讲解一下真正的低通滤波器
先说一下在opencv中的两种滑动实现方式:Blur()和boxFilter()函数
在官方文档里面的解释是两种方式都一样,其实有一点不一样,boxFilter()是可以不用归一化的,而Blur()是必须归一化的.
在2D当中的卷积(Convolution in 2D)
跟之前的滑动并不一样,它公式是减号.如果对一个对称的boxfilter是没有影响的.只有对那些非对称的滑动窗口才不一样.总结如下
对于二维的滤波称为相关,在做运算的时候,相关与卷积如果boxfilter是对称的那么结果就是一直的,如果boxfilter是非对称的,那么结果不一致,但是二者意义是大同小异的.
在之前的boxfilter的之后会出现振铃现象,二维高斯滤波器是真正的底通滤波器,在频域里面是没有振铃的,非常平滑,高频完全阻断.
高斯滤波器的实现:
相关以及卷积都是线性时不变的,那么它的优点有两个滤波器对一幅图像依次进行线性滤波的话,它就等于先对两个滤波器做运算,再对图像做运算.
非线性滤波器:中值滤波器
它对于椒盐噪声有很好的效果
简单小结:
双边滤波器:不但滤除了噪声,还保证了边缘的陡峭性.其速度很慢,很难运用于实时计算.(它是两种滤波器的组合)
滤波在图像增强去噪等用得特别多.
图像滤波:在每一个像素位置对其附近像素点的一种运算.
模板匹配:DIC数字图像相关,DSCM数字散斑相关方法.
边缘检测
目标是在一幅图像中识别突然的变化(或者不连续).
直观地,用图像边缘的信息来表达整个图像的语义信息以及形变信息比用整个图像来表达更加紧凑.
我们为什么这么关注边缘:
首先,提取信息识别物体;然后,可以恢复几何学以及观察视点.
边缘是怎么产生的?
1.由于深度的不连续.
2.物体表面对于光的反射率不同.
3.照明的不连续(有阴影).
下面抽象一下这个问题,在图像里面是如何产生边缘的
由于明暗的变化,由白变黑就会产生边缘
从一个低灰度值渐变到一个高的灰度值的过程中会产生边缘.
对于一维的数据进行边缘,就是对其求一阶导数,其求到极值的位置就是边缘的位置
编程的实现:1介导数的数字近似
通过前像和后向差分来求取倒数.
如果用模板的形式来表示,它应该就是一个1*3的卷积模板,在图像中进行滑动
其得到的输出值就是上面的倒数.
分别对应的模板
最右边表达的是梯度的大小,幅值.
之前降到提取边缘的时候就是左图像的差分,然而拿到真正数据的时候还有噪声,故拿到一幅图像之前要先进行滤波,然后再进行边缘检测.
因为求梯度运算对噪声是非常敏感的.
首先拿到一个新的3*3的边缘检测的滤波器,可以把它看成是[1 1 1]T与[-1 0 1]进行卷积的结果.
通过上面就可以在竖直方向进行去噪,同时检测出竖直方向的边缘.
下面是在水平方向的去噪以及边缘检测
滤波器进行不同的翻转可以得到不同的边缘
箭头方向表示灰度的变化方向.
boxfilter翻转就是卷积不是翻转就是累加求和的方式.
一维的二阶倒数
可以理解为一幅图像某一行的像素变化情况,如下F(x)所示
高斯的二阶导
对于做运算
即用boxfilter函数h与图像函数f进行卷积之后再进行二阶导等价于先对boxfilter函数h进行二阶导然后再对图像函数进行卷积结果是等价的.
对于一阶导的边缘检测:
就是其一阶导大于某个值域,或者二阶导为零,
对于二维图像的边缘检测:
图像的拉普拉斯为
高斯拉普拉斯滤波器
下面讲解图像在离散域上的二阶导数
在水平方向上的边缘
下面演示一下梯度的方向
下面是对原图像进行梯度边缘处理之后的效果
如果梯度大于某个阈值τ,这个值是局部最大值,以及梯度方向的像素是一个边缘的候选者.
然而我们拿到的是一个有渐变的比较粗略的边缘
非极大值抑制
在梯度的方向上来找到每一个位置的像素的变化从而找到局部的最大值
下面将解一下canny算子边缘检测算法
下面图是沿着梯度方向取的一组数据,然后通过横线来设定一个门限值,图中有三个值都高于该门限,这是我们看到的比较粗的那个边缘,然后我们需要的是找到一个局部里面的最大值
对局部的情况进行非极大值抑制,在局部的区域只保留最大值,非最大值都舍去.
canny的做法是
垂直于边缘的 方向,找0,45,90,135度的方向,
然而在canny在实现的时候,还是有一些细节,当阈值取得很大的时候,边缘检测就会检测断断续续的边缘,如果阈值很小,检测出的边缘很多,不是边缘的都检测出来了,那么它怎么做的呢,就是选了两个阈值一个高的一个低的,大的检测出了一些边缘,小的也检测出了一些边缘,然后把二者检测出的边缘拼接起来,会把不连续的边缘舍去(由于门限低而检测出的边缘),把连续的边缘保留下来了.所以就成了一个强边缘加上一个弱边缘的并集,
其效果:
对角点会出现一些问题.
之前我们检测出来的边缘并不是一条线,而是一些曲线,那我们怎么才能检测出线呢
项目:车牌识别(主要是车牌的定位以及车牌的字符识别)
1.图像分割
2.特征提取
3.模式识别
1)Support vector machine
2)Artificial neural network
主要步骤:车牌的检测(包括图像分割以及特征提取),即找到车牌在一副图像当中的位置;和车牌的识别(模式识别)
将RGB图转换为GRAY图,再进行滤波,然后进行边缘检测,用sober滤波器找到数值边缘,然后进行阈值化,把数值边缘的某些区域删除掉,运用闭操作.然后选择各种可能的车牌的位置,用矩形框框起来.然后从框住的区域运用长宽比进行进一步删选,由于拍摄的时候是从上向下拍,进行仿射变换,变成正常的车牌大小的区域,在这里基本就完成了分割.
SVM(支持向量机)
由于两组数据标签不同,故用不同的颜色来表示不同的标签;通过SVM来划分两组数据,那么该分界线就是SVM选择的,因为该分界线到两组数据的距离最大;该分界线对噪声的容忍度最大,
在上图能决定超平面的位置的是三个点,把这三个点称为支持向量(SV),
对于两个类别用一根线就可以区分,称为线性数据,当一根线不能区分的时候就称为非线性数据,如上面所示.
遇到非线性问题,我们想到的就是忘高维空间转,转成一个线性问题,然后进行分类,把数据往高维空间转,涉及到一个问题就是空间爆炸问题,引入kernel避免了把数据往高维空间转所带来的维度的增长.