OpenCV+Python车牌字符分割和识别入门 (含新能源车牌识别)

车牌识别三大步骤:

1、从图中找出车牌

2、从车牌中识别车牌号

3、通过训练提高识别率

       本次仅实现第二步,这也是核心,其他两个属于附属功能,第三个可以通过GAN或Tesseract来进行训练,这个下篇再进行介绍。

核心步骤:

       图片处理:1、将图片灰度化;2、将灰度图片二值化;3、校正;4、去燥;

       图像切割识别:1、图像切割;2、图像识别

代码演示(注释):

        需要导入,引入库为:opencv-python

#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
    Author Alexantao By Charm
"""

import cv2

# 定义,都可根据应用进行调整
binary_threshold = 100
segmentation_spacing = 0.9  # 普通车牌值0.95,新能源车牌改为0.9即可


# 1、读取图片,并做灰度处理
img = cv2.imread('img/nycar_num_test1.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow('gray',img_gray)
cv2.waitKey(0)


# 2、将灰度图二值化,设定阀值为140
img_thre = img_gray
cv2.threshold(img_gray, binary_threshold, 255, cv2.THRESH_BINARY_INV, img_thre)
cv2.imshow('threshold', img_thre)
cv2.waitKey(0)

# 3、保存黑白图片
cv2.imwrite('img/thre_res.png',img_thre)

# 4、分割字符
white = []  # 记录每一列的白色像素总和
black = []  # 记录每一列的黑色像素总和
height = img_thre.shape[0]
width = img_thre.shape[1]
print(width, height)
white_max = 0   # 仅保存每列,取列中白色最多的像素总数
black_max = 0   # 仅保存每列,取列中黑色最多的像素总数

# 循环计算每一列的黑白色像素总和
for i in range(width):
    w_count = 0     # 这一列白色总数
    b_count = 0     # 这一列黑色总数
    for j in range(height):
        if img_thre[j][i] == 255:
            w_count += 1
        else:
            b_count += 1
    white_max = max(white_max, w_count)
    black_max = max(black_max, b_count)
    white.append(w_count)
    black.append(b_count)


# False表示白底黑字;True表示黑底白字
arg = black_max > white_max


# 分割图像,给定参数为要分割字符的开始位
def find_end(start_):
    end_ = start_ + 1
    for m in range(start_+1, width - 1):
        if(black[m] if arg else white[m]) > (segmentation_spacing * black_max if arg else segmentation_spacing * white_max):
            end_ = m
            break
    return end_


n = 1
start = 1
end = 2
while n < width - 1:
    n += 1
    if(white[n] if arg else black[n]) > ((1 - segmentation_spacing) * white_max if arg else (1 - segmentation_spacing) * black_max):
        # 上面这些判断用来辨别是白底黑字还是黑底白字
        start = n
        end = find_end(start)
        n = end
        if end - start > 5:
            print(start, end)
            cj = img_thre[1:height, start:end]
            cv2.imwrite('img/{0}.png'.format(n), cj)      #此句是输出每个字符,当时未输出直接看的时候因为刷新问题,解决好久,后来发现只是显示刷新的问题
            cv2.imshow('cutChar', cj)
            cv2.waitKey(0)

图片:

           OpenCV+Python车牌字符分割和识别入门 (含新能源车牌识别)_第1张图片

          

     二值图片:(白底黑字)

         

     分割后:

          一个一个字符分割显示。

你可能感兴趣的:(opencv,车牌识别,Python,python之道)