机器学习-车牌识别与分割

2.实验的过程与分析
一.转换色彩空间
HSV表示的是色相、饱和度和明度。
在这些色彩空间中,色彩的色相有一个单独的色相通道表示,色彩的鲜艳程度有一个饱和度通道表示,而亮度或者明度由一个亮度通道或者明度通道表示openCV中cv2.cvtColor就可以轻松地把RGB图像转换到HSV色彩空间:绘制出这些通道的灰度版本 以便观察各通道的强度,像素越亮代表的颜色值就越高。一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。H:0—180,S:0—255。V:0—255。
因为RGB通道并不能很好地反映出物体具体的颜色信息,而相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。hSv颜色模型是面向用户的。对于彩色的图片来说,直方图均衡化一般不能直接对R、G、B三个分量分别进行上述的操作,而要将RGB转换成HSV来对V分量进行直方图均衡化的操作。
二.直方图均衡化
因为直方图均衡化处理之后,原来比较少像素的灰度会被分配到别的灰度去,像素相对集中,处理后灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。
  直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
直方图均衡化要注意选用累计分布函数,使用累积分布函数处理后像素值会均匀分布。注意:像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗的依旧暗,只是对比度增大,绝对不能明暗颠倒;如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。累积分布函数具有一些好的性质,单调递增。
图像处理库PIL,convert()函数,在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本次实验使用的是python中的图像处理库PIL来实现不同图像格式的转换。模式“L”位灰色图像。
三.边缘检测
1.高斯模糊处理,去噪;
2.sobel计算水平导数,对x求导,检测垂直方向的边缘;

3.canny水平检测;

4.二值化处理;

5.闭操作,形态学操作,主要是让车牌的轮廓更加明显,消除无用的噪点。因为车牌也是一个横向的长方形,这样效果更好。可根据具体情况适当增加开 闭操作的次数;

6.提取外部轮廓。

边缘检测其目的在于标识出数字图像中亮点变化明显的点进而提取出有用的信息。通常情况下我们可以将数字图像表示为二维数组,而该二维数组中每个元素的值则对应着图像各个像素点的灰度值。而边缘检测的根本原理是通过算法将该数组总的各个数据领域内数值变化大的数据元素进行屏蔽或降低其灰度显示。不难看出其边缘检测的图像即为如何找出一种算法来突出这种领域内的数值变化率。
边缘提取其实也是一种滤波,不同的算子有不同的提取效果。比较常用的方法有三种,Sobel算子,Laplacian算子,Canny算子。Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素;当对精度要求不是很高时,是一种较为常用的边缘检测方法。Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉, Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。
为去除掉背景的噪声,单独的处理车牌这一目标对象,我们将原始的灰度图像进行二值化处理。利用Otus算法进行二值处理。
四.字符分割
Skimage提供了io模块,用于图片的输入输出操作。

1.转化为灰度图像。

2.canny边缘检测并膨胀,canny算子也可以用来提取边缘特征,放在feature模块里,函数格式:skimage.feature.canny(image,sigma=1.0),sigma越小,边缘线条越细小。

膨胀就是让一个区域变大,img4=morphology.dilation(img3)。

3.标记并筛选区域,skimage.measure.label()函数,对二值图像进行连通区域进行标记,它的返回值就是标记,并没有对二值图像进行改变。skimage.measure.regionprops()函数,如果想分别上面的的每一个连通区域进行操作,比如计算面积、外接矩形、凸包面积等,则需要调用measure子模块的regionprops()函数。属性bbox,边界外接框。Bbox是包含物体的最小矩形。

4.提取单个字符图像,sorted(d.items(),key=lambda x: x[1])中d.items()为待排序的对象;key=lambda x: x[1] 为对前面的对象中的第二维数据(即value)的值进行排序。 key=lambda变量:变量[维数]。维数可以按照自己的需要进行设置。

你可能感兴趣的:(机器学习-车牌识别与分割)