车牌识别算法讲解
Canny 边缘检测
预处理:将图像灰度化
1、去噪(均值滤波、中值滤波、高斯滤波)
2、求图像梯度的幅值和方向
由于幅值是 x 方向和 y 方向的叠加,根据 x 方向和 y 方向的权重,该幅值的方向也能求出来,这个在后面
非极大值抑制中用来定位参与计算的点。
最右边和最下边的点是不参与计算的.
3、非极大值抑制
(1)将图像边缘的点去除掉(这里只需要将边缘的像素点灰度值变为 0 即可)
(2)内部点梯度值为 0 的去除掉(梯度为 0,就是灰度没有变化,一定不是边缘点)
(3)在垂直边缘方向上,两侧灰度值的加权和是否都比边缘上点的灰度值小,就是要找到极大值点,边
缘的方向有四种情况
x<y weight=|x|/|y| x〉y weight=|y|/|x|
4、灰度图像二值化
Sobel 算子
1、预处理:将图像灰度化
我们所说的算子是给图像做卷积的单位。这个单位可以大,可以小。大的有 5x5 的矩阵,这就是二阶微分
算子,有高斯—拉普拉斯算子
这个单位也可以小,比如 3x3 的矩阵,有 prewitt 算子和 sobel 算子。
也有更小的 2x2 矩阵的 Roberts 算子
这些都有其运用的地方,再小或者更大的就失去实际运用的效果了.
2、这里我选择了 sobel 算子。它由水平梯度模板和垂直梯度模板组成。用水平梯度模板和图像卷积后,就
能表象图像像素点值在水平方向上的变化.图中的水平线段由于在水平方向上基本上没有变化,所以变换后
的图像也基本上看不到水平线段了.垂直梯度模板同理。将两幅图像通过公式相加后就得到了边缘被锐化的
图像。这里的边缘由于知道水平和垂直分量,所以其也是有方向性的。
3、将图像二值化后就能得到边缘的线段了.这里也要注意一下,线段有可能不是一个像素宽度的,如 Roberts
算子,我们就要对其进行图像细化,将线段变成一个像素点宽度,方法我会在后面介绍。
Hough 变换
经过之前的处理过后,我们用肉眼就能看到二值图像中有一条一条的线段.计算机是如何识别这些线段的
呢。这里用了 Huogh 变换.
我们平常描述线段 y=mx+b,m 和 b 是已知量,x 和 y 是变量。Hough 变换中我们把 x 和 y 变成已知量,图
像中线段上的每个像素点就对应一个 x 和 y。运用公式就可以将即将(x,y)平面的每个点变换为ρ-θ空间的
每一条曲线。曲线的交点就是过这些点的公共的直线,利用这个方法就能定位图像中的直线。
字符分割
这里我们只讨论大陆的蓝底车牌。这样的车牌是有固定的特点的。
在字符分割时还要处理几种情况。
在投影的图像中,我们也可以发现一些东西。不同的字符投影有些区别不大,有些是有明显的区别的。
我们可以通过这些来辅助判别一些字符。