问题描述
1.当拍摄一张包含车牌信息的照片时,往往还含有一些不必要的信息,这些信息在人眼中很容易被过滤,但是对于电脑来说,分辨出非有用信息是非常困难的,所以需要为电脑设计一些方法,帮助它去除无用信息,也就是提取需要的车牌区域。
解决方案
2.1 方法原理
提取车牌区域的原理是先将图片中车牌区域的轮廓表示出来,再去除一些不必要的区域,然后将轮廓连通的区域进行填充,最后利用车牌的面积、长宽比例的特点,将车牌区域在原图中划分出来
2.2 步骤
2.2.1图像预处理
图像预处理主要是对图像灰度化和二值化,灰度化图像后更有利于不必要信息的去除,在选择灰度化方法时,可以采用电视工业标准,二值化后的图像则有利于Canny算法的轮廓提取。
2.2.2提取轮廓边缘
边缘的提取主要是采用Canny算法,将图像区域中边缘点提取出来,Canny算法的图像增强步骤中有几种专门的算子,对于车牌区域的提取,一般选用soble算子。
2.2.3去除部分轮廓
去除部分轮廓的原理是先通过闭操作将图像的轮廓进行填充,再通过开操作将图像中的不满足车牌区域特点的轮廓过滤掉,部分Python代码如下:
#进行闭运算 kernel = np.ones((5, 15), np.uint8)#设置结构元素 closingimg = cv.morphologyEx(DT, cv.MORPH_CLOSE, kernel) cv.imshow('closingimg', closingimg) cv.waitKey(0) cv.destroyAllWindows() # 进行开运算 opening_img1=cv.morphologyEx(closingimg,cv.MORPH_OPEN, kernel) cv.imshow('opening_img', opening_img) cv.waitKey(0) cv.destroyAllWindows() # 再次进行开运算 Kerne2 = np.ones((25, 5), np.uint8)#设置新的结构元素 opening_img2=cv.morphologyEx(opening_img1,cv.MORPH_OPEN, kerne2) cv.imshow('opening_img2', opening_img2) cv.waitKey(0) cv.destroyAllWindows() |
上述部分代码是运用闭操作和开操作的python代码,由于图像预处理和Canny算法提取图像轮廓之前已经有讲解,这里就省略了那一部分得大量代码。实验结果如下:
图2.2.3.1 原始车牌图像
图2.2.3.2 去除一些区域的轮廓图
2.2.4提取车牌部分轮廓
提取车牌轮廓可以根据车牌得长宽比例和面积特点,将图像中的车牌部分标准出来,需要对得到的图像进行寻找、绘制轮廓的操作,这个步骤可以使用cv2中findContours和drawContours函数来完成;最后通过绘制的轮廓在原图中相应位置上进行车牌区域提取。
结语
3.本方法适合用于正面拍摄的车牌图片,可以有效的将车牌区域提取出来,需要注意的是,一些图片的效果可能会不理想,这跟图片拍摄的环境和角度都有关系,同时,结构元素的选取也可以变动,这也造成了提取效果的不同,所以对于车牌提取的算法还需要不断的进行优化。