上一篇文章内容为车牌定位,这篇文章从原理及代码角度分析如何分割字符。


文章目录

  • 一. 分割字符的目的
  • 二. 分割字符原理:
  • 三. 代码
  • 四. 代码分析

一. 分割字符的目的

定位车牌仅仅是为了找出其车牌的左上角及右下角的坐标。框出车牌终究只是给我们了一个视觉效果。找出车牌位置的目的就是为了分割字符,为什么要分割字符呢。这要从我们的机器学习说起了,总体的车牌识别大概是个什么流程呢。

  • 首先通过某种算法定位车牌。
  • 其次从车牌位置按序取出字符。
  • 识别字符。

机器学习就是在最后一步发挥大作用的,或许我们可以通过一系列参数的调整,或者某些算法的调整,识别一些简单的英文,数字。但是识别必然会非常有限。那么如先所说,这一张图片在计算机眼中代表的是一个一维或者多维的矩阵。车牌上的各种字符数字有其自己的规划,那我们如果将图片转化为二值图片,并且将字符凸显出来,那么构造某种机器学习算法对某个字符的数据集做训练,并得到一个模型,这个模型理所当然的具有判断某种尺寸的照片上含有什么字符的功能。而作为前提,分割字符也是必要做好的。

二. 分割字符原理:

像这样一幅车尾图,在经过第一轮找到车牌位置之后,图片大致的会像这样。

如果将其变化二值图片的话,就是,这样。

对字符的分割采用以列计数像素点的思路。如"苏"与"D"之间,明显是存在这样一道黑色的缝的,后面的字符同样具备这样的特征,那么依此为参考,可以对图片从左至右滑,做遍历。一直统计白色像素点和黑色像素点的个数,并设置阈值,比如,如果黑色位置开始往右走五,还没有到达白色的阈值,那么我们就认为该黑色部分为边界。只有一个特殊情况需要考虑,那就是数字存在"1"的情况下,会很窄,因此我们直接大胆估计它就是一。(这里也不需要再将1裁剪下来,只需要在样本库中copy一个1就可以了。)裁剪图片的话,还是一个找轮廓加判断的过程,与当时这一步如出一辙。

三. 代码

#分割车牌
def cut_license(image,rect):#获取高度和宽度 注意切割的参数为x,y,w,hrect[2]=rect[2]-rect[0]rect[3]=rect[3]-rect[1]#传入参数要求为元组rect=tuple(rect)#掩膜mask=np.zeros(image.shape[:2],np.uint8)'''bdgModel,fgdModel-算法内部使用的数组.你只需要创建两个大小为(1,65),数据类型为np.float64的数组。'''#创建背景模型  大小只能为13*5,行数只能为1,单通道浮点型bgdModel=np.zeros((1,65),np.float64)#创建前景模型fgdModel=np.zeros((1,65),np.float64)#分割图像cv.grabCut(image,mask,rect,bgdModel,fgdModel,5,cv.GC_INIT_WITH_RECT)mask2=np.where((mask==2)|(mask==0),0,1).astype('uint8')mask2=mask2[:,:,np.newaxis]img_show=image*mask2return img_show
'''
对车牌图像的二值化
'''
def plate_binary(plate):'''车牌图片二值化'''#转化为灰度图gray=cv.cvtColor(plate,cv.COLOR_BGR2GRAY)#去除噪音gray=cv.filter2D(gray,-1,np.ones((3,3),np.float32)/9)#图像二值化ret,thresh=cv.threshold(gray,120,255,cv.THRESH_BINARY)return thresh
'''
利用列元素求和进行字符分割,效果会比较好,但是出了一些问题。
'''
# 分割图像,给定参数为要分割字符的开始位
def find_end(start,black,width,black_max):end=start+1for m in range(start+1,width-1):if (black[m])>(0.95*black_max):end=mbreakreturn end'''
思路就是从左开始检测匹配字符,若宽度end-start小与5则认为为边界。直接略掉。
'''
def cut_str(thresh):black = []  # 记录每一列的黑色像素总和height = thresh.shape[0]  # 263width = thresh.shape[1]  # 400black_max = 0  # 仅保存每列,取列中黑色最多的像素总数# 计算每一列的黑白像素总和for i in range(width):line_black = 0  # 这一列黑色总数for j in range(height):if thresh[j][i] == 0:line_black += 1black_max = max(black_max, line_black)black.append(line_black)n=1start=1end=2#这边从1开始while n < width - 2:n += 1start=nend=find_end(start,black,width,black_max)n=endif end - start > 5:cj = thresh[1:height, start:end]#进行字符的裁剪b_img=cv.resize(cj, None,fx=5,fy=3)contours, hierarchy=cv.findContours(b_img.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)block=[]for c in contours:'''计算字符图像特征'''r = find_rectangle(c)a=(r[2]-r[0])*(r[3]-r[1])s=(r[2]-r[0])/(r[3]-r[1])block.append([c, r, a, s])block=sorted(block, key=lambda block: block[2])[-1:]box=block[0][1]y_mia=box[0] x_min=box[1] y_max=box[2] x_max=box[3] cropImg = cv.resize(b_img[x_min:x_max, y_mia:y_max],(32,40))'''这里得到的图片就是我们需要的字符图片。可以选择show或者保存下来。'''

四. 代码分析

这里主要要阐明几个方法。

cv.grabCut()

它主要实现的是一个交互式的前景提取。
大致过程如下:

额,这个很容易看明白就不需要讲解了。
如下为它的参数要求。

gray=cv.filter2D(gray,-1,np.ones((3,3),np.float32)/9)

这个filter2D之前的博客讲的很清楚,不过这里还是得再说。
cv2.filter2D():使用自定义内核对图像进行卷积,它不仅可以让图像变得模糊,还可以让图像变得更锐化。该方法的使用花样很多,这里不细说,-1参数代表所需要的的深度,这里是默认。kernel表示卷积核。可以记住这种方法,一般的模糊和锐化不会改动其他地方,最大的改动应该就是自己定义的卷积核,

import cv2 as cv
import numpy as np#自定义模糊
def get_customer_burry(image):#定义卷积核,算子#该方法与均值模糊 5*5的卷积类似#kernel=np.ones([5,5],np.uint32)/25#kernel=np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9#image=np.float32(image)#卷积的锐化算子kernel=np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)dist=cv.filter2D(image,-1,kernel=kernel)cv.imshow('customer',dist)

这段代码小伙伴可以自己试试。它可以实现锐化或者模糊。

剩下的大多就是算法层面了,也不需要多讲了,自己多看看思考思考就行。

python-opencv实战:车牌识别(二):字符分割与保存相关推荐

  1. Python+Opencv简易车牌识别(二):形态学运算,HSV颜色空间筛选与图像分割

    注:这是依然一个简单的车牌识别demo 1.前言 在上一篇Python+Opencv简易车牌识别(一):基于HSV颜色空间的图像分割中,我们讲了如何仅基于颜色来进行简单粗暴的车牌分割.今天我们考虑对图 ...

  2. opencv实现车牌识别之字符分割

    简介 在前一篇中,我们已经定位出来了在图片中车牌号的位置,并且将车牌号图片复制成了新图片,并显示出来,本章在这些被截取出来的图片上继续处理. 截取出来的新图片如下: 图像灰阶/二值化 首先也是选择将图 ...

  3. 2021-01-07 python opencv实现车牌识别 颜色定位

    python opencv实现车牌识别 颜色定位 主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https ...

  4. 【开源分享】基于Python+OpenCV+PyQt5车牌识别(GUI界面)

    亲测无错:基于Python+OpenCV+PyQt5车牌识别(GUI界面)绝对可以用的!!!!! 基于Python+OpenCV+PyQt5车牌识别(GUI界面) 参考文档

  5. 基于Python opencv实现车牌识别及二维码条形码识别系统 附完整源码

    完整代码:https://download.csdn.net/download/qq_38735017/87416699 原理简介 车牌字符识别使用的算法是 opencv 的 SVM opencv 的 ...

  6. OpenCV实现车牌识别,OCR分割,ANN神经网络

    主要步骤: 准备车牌单个字符图像作为神经网络分类器的训练数据,越多越好.当然需要对每幅图像提取特征,这里使用的是水平和垂直累计直方图和缩小后的图像信息. 获取车牌图像,这里的车牌图像已经完成抠图,并且 ...

  7. 基于python+Opencv的车牌识别

    车牌识别包括车牌检测(通过图像分割.特征提取获得车牌位置)+车牌识别(对检测到的车牌进行字符内容识别). 一.基本流程如下: 1.车牌检测 1)读取需要进行车牌识别的图片: 2)对图像进行灰度化处理( ...

  8. 车牌识别系统论文python_毕业设计 python opencv实现车牌识别 界面

    #-*- coding: utf-8 -*- __author__ = '樱花落舞' importtkinter as tkfrom tkinter.filedialog import * from ...

  9. python车牌矫正_毕业设计 python opencv实现车牌识别 矩形矫正

    defimg_Transform(car_contours,oldimg,pic_width,pic_hight): car_imgs=[]for car_rect incar_contours:if ...

  10. python基础教程:python+OpenCV实现车牌号码识别

    这篇文章主要介绍了python+OpenCV实现车牌号码识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 基于python+OpenCV的车牌号码识别,供大家参考,具 ...

最新文章

  1. ajax成功进入success但是获取不到返回值
  2. SQL预编译防注入小测试
  3. 基于 Flink + ClickHouse 打造轻量级点击流实时数仓
  4. Unicode 属性类
  5. 【BZOJ2330】【tyvj1785】【codevs2404】糖果,第一次的差分约束
  6. Android学习——SharedPreferences
  7. python绘制三维图散点图_python 绘制三维图形、三维数据散点图
  8. Android Espresso
  9. Android通过命令连接wifi(解决usb不能用+无屏幕情况)
  10. Python判断字符类型
  11. 通过 api 调用检查具体日期是否为法定节假日
  12. 拆分单元格怎么弄?合并起来了怎么办?
  13. 关于sigmoid函数几点介绍
  14. input框只能输入非负数
  15. 笑晕,小米新logo是这么来的
  16. 易语言python识别图片验证码_图片识别-打码平台-打码网站-识别验证码-图鉴网络科技有限公司...
  17. 适应Linux32位的qq,Ubuntu 安装 QQ (简易安装 适合32位操作系统)
  18. vs.Net2003无法打开或创建Web应用程序若干解决办法
  19. 最新CcPay多商户个人收款码支付系统源码+UI很不错
  20. [黑科技] WPS通过VB宏函数实现自编号功能

热门文章

  1. 10 3在c语言中的意思,维生素c3十是什么意思
  2. 怎么学习ArcPy?聊一聊学习心得
  3. 盛迈坤电商:直通车的优化操作技巧
  4. if laytpl 非_laypage+laytpl
  5. 持之以恒的坚持,是三星W系列多年赢得市场的原因
  6. python偏最小二乘法回归分析_【数学建模】偏最小二乘回归分析(PLSR)
  7. three.js精灵模型-下雨场景效果模拟
  8. 中兴PON设备通过MEF认证
  9. icomoon下载字体图标
  10. 【CGroup原理篇V1】十四、NET_PRIO子系统