一、OpenCV+Python车牌字符分割
车牌号检测大致分为以下四个部分:
1.车辆图像获取
2.车牌定位
3.车牌字符分割
4.车牌字符识别
处理原理
车牌定位需要用到的是图片二值化为黑白后进canny边缘检测后多次进行开运算与闭运算用于消除小块的区域,保留大块的区域,后用cv2.rectangle选取矩形框,从而定位车牌位置 车牌字符的分割前需要准备的是只保留车牌部分,将其他部分均变为黑色背景。这里我采用cv2.grabCut方法,可将图像分割成前景与背景。分割完成后,再经过二值化为黑白图后即可进行字符分割。由于图像中只有黑色和白色像素,因此我们需要通过图像的白色像素和黑色像素来分割开字符。即分别通过判断每一行每一列的黑色白色像素值的位置,来定位出字符。
具体步骤:
1.灰度转换:将彩色图片转换为灰度图像,常见的R=G=B=像素平均值。
2.高斯平滑和中值滤波:去除噪声。
3.Sobel算子:提取图像边缘轮廓,X方向和Y方向平方和开跟。
4.二值化处理:图像转换为黑白两色,通常像素大于127设置为255,小于设置为0。
5.膨胀和细化:放大图像轮廓,转换为一个个区域,这些区域内包含车牌。
6.通过算法选择合适的车牌位置,通常将较小的区域过滤掉或寻找蓝色底的区域。
7.标注车牌位置
8.图像切割和识别
二、代码实现
为了方便处理,我们新建一个名为cp的文件夹,将要识别的车牌按照cp1.BMP的方式命名
代码
import cv2
import numpy as np
import os
def stackImages(scale, imgArray):
""" 将多张图像压入同一个窗口显示 :param scale:float类型,输出图像显示百分比,控制缩放比例,0.5=图像分辨率缩小一半 :param imgArray:元组嵌套列表,需要排列的图像矩阵 :return:输出图像 """
rows = len(imgArray)
cols = len(imgArray[0])
rowsAvailable = isinstance(imgArray[0], list)
# 用空图片补齐
for i in range(rows):
tmp = cols - len(imgArray[i])
for j in range(tmp):
img = np.zeros((imgArray[0][0].shape[0], imgArray[0][0].shape[1]), dtype='uint8')
imgArray[i].append(img)
# 判断维数
if rows>=2:
width = imgArray[0][0].shape[1]
height = imgArray[0][0].shape[0]
else:
width = imgArray[0].shape[1]
height = imgArray[0].shape[0]
if rowsAvailable:
for x in range(0, rows):
for y in range(0, cols):
if imgArray[x][y].shape[:2] == imgArray[0][0].shape
文章评论