蓝色车牌识别OpenCV-Python

前言

定位车牌位置有很多方法可以成功的定位,而每种方法都有各自的优缺点。


提示:以下是本篇文章正文内容,下面案例可供参考

一、程序体会

在这里插入图片描述
我是基于HSV转换取到大概率车牌的位置,然后高斯去噪,灰度处理,Sobel算法边缘检测(x方向检测,x方向结果较好),自适应阈值二值化处理,进行膨胀腐蚀,中值滤波去除噪点。不过HSV的mask图设置的为蓝色的阙值只能识别蓝色车牌,如果要识别的绿色或黄色的车牌要换阙值.

形态学运算最好先为CLOSE运算,填充字块连在一起,效果不好可以调整核的大小以及迭代次数。花的最长时间在形态学的调试,要尝试不同的膨胀腐蚀的结果,达到最佳,才能定位好车牌。最后车牌轮廓检测,要选好提取轮廓的比例和矩形的大小,最好在图片处理前同一固定好图片大小,最后的到的满足条件的矩形作为车牌,最好另保存好图片,这样效果会好一点。

上面只是将车牌定位出来了,我们的目的是识别,但目前还不能直接识别出车牌里面的字符。第一次做法是对字符进行分割,然后再一个字符一个字符的识别。字符分割的方法有很多种,比如直方图切割,我们这里按比例分割:车牌样式是固定的,字符的大小也是固定的,就可以直接根据比例来分割出字符来,但是这样对上一步的要求就比较高,要求切割出来的车牌必须的方方正正的,要不然效果可能不如意。字符识别有OCR框架也有模板匹配,PIL。我选取的OCR框架识别单个字符,但效果非常差,所有最后我采取的方式是对车牌原图高斯去噪,灰度处理然后识别一次OCR得str1,二值化识别一次OCR的str2,最终车牌号为str1(汉字)+A_z(字母)+str2(数字/字母)。

图像处理的步骤有很多种方法,各有优点,大家可以自己去研究。目的就是为了找去我们要的那一块矩形区域。同时,我们用到的卷积核大小,都是自己调的,不一定要按照我这个来。

二、使用步骤

1.系统分析

车牌识别的大体步骤:
获取图片->图像处理->车牌字符分割->字符识别
在这里插入图片描述
具体流程图:
在这里插入图片描述

2.事前定义函数

# 显示图片
def cv_show(name, img):  # 生成窗口显示--opencv读取的格式是BGR
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# plt显示彩色图片
def plt_show0(img):  # plt.imshow 是以RGB顺序保存
    b,g,r = cv2.split(img)
    img = cv2.merge([r,g,b])
    plt.imshow(img)
    plt.show()
    
# plt显示灰度图
def plt_show(img):
    plt.imshow(img, cmap='gray')
    plt.show()
    
def my_cv_imread(filepath):  # 解决python中OpenCV库读取图像函数不支持中文路径问题
    # 使用imdecode函数进行读取
    img = cv2.imdecode(np.fromfile(filepath,dtype=np.uint8),-1)
    return img

3.车牌定位

def color_change(picture):  # 将图片转化到HSV空间,并按位取反,突出车牌区域
    #转化为HSV颜色空间
    hsv=cv2.cvtColor(picture,cv2.COLOR_BGR2HSV)     
    
    # 函数通过设置不同的h、s、v的min和max阈值可以获取不同色彩的一个二值的mask图
    lower_blue=np.array([100,43,46])   #蓝色阈值
    upper_blue=np.array([124,255,255])
    #构建掩模
    mask=cv2.inRange(hsv,lower_blue,upper_blue)     
    
    #按位与操作函数
    res1=cv2.bitwise_and(image,image,mask=mask) 
    plt_show0(res1)
    # plt_show(res1) 通道数不对
    return res1

def Gauss_image(img):# 高斯去噪
    image = cv2.GaussianBlur(img, (3, 3), 0)  # 高斯矩阵的长与宽都是3,标准差取0
    plt_show0(image)
    return image

def Gray_image(img):    # 灰度处理
    gray_image = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    plt_show(gray_image)
    return gray_image

def Sobel_x_image(gray_image)
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值