Python中OpenCV实现简单车牌字符切割


Posted in Python onJune 11, 2021

在Jupyter Notebook上使用Python+opencv实现如下简单车牌字符切割。关于opencv库的安装可以参考:Python下opencv库的安装过程与一些问题汇总

Python中OpenCV实现简单车牌字符切割

1.实现代码

import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

#读取原图片
image1=cv2.imread("123456.jpg")
cv2.imshow("image1", image1)

#灰度化处理
image1_1=cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)
cv2.imshow("image1_1", image1_1)

#图像反色
h,w = image1_1.shape
image1_2=image1_1.copy()
for i in range(h):
    for j in range(w):
        image1_2[i,j] = 255-image1_2[i,j]
cv2.imshow('image1_2', image1_2)

#图像二值化
ret,image2 = cv2.threshold(image1_2, 100, 255, cv2.THRESH_BINARY)
cv2.imshow('image2', image2)

#水平投影
h1,w1=image2.shape #返回高和宽
image3=image2.copy()
a = [0 for z in range(0, h1)] #初始化一个长度为w的数组,用于记录每一行的黑点个数 
#记录每一行的波峰
for j in range(0,h1):  
    for i in range(0,w1):  
        if  image3[j,i]==0: 
            a[j]+=1 
            image3[j,i]=255
            
for j in range(0,h1):  
    for i in range(0,a[j]):   
        image3[j,i]=0    
        
plt.imshow(image3,cmap=plt.gray())#灰度图正确的表示方法
plt.show()
cv2.imshow('image3',image3)  

#垂直投影
h2,w2=image2.shape #返回高和宽
image4=image2.copy()
b = [0 for z in range(0, w2)]  #b = [0,0,0,0,0,0,0,0,0,0,...,0,0]初始化一个长度为w的数组,用于记录每一列的黑点个数
#记录每一列的波峰
for j in range(0,w2): #遍历一列 
    for i in range(0,h2):  #遍历一行
        if  image4[i,j]==0:  #如果该点为黑点
            b[j]+=1  #该列的计数器加一,最后统计出每一列的黑点个数  
            image4[i,j]=255  #记录完后将其变为白色,相当于擦去原图黑色部分
            
for j in range(0,w2):  
    for i in range((h2-b[j]),h2):  #从该列应该变黑的最顶部的点开始向最底部涂黑
        image4[i,j]=0   #涂黑
        
plt.imshow(image4,cmap=plt.gray())
plt.show()
cv2.imshow('image4',image4) 

#分割字符
Position = []
start = 0
a_Start = []
a_End = []

#根据水平投影获取垂直分割位置
for i in range(len(a)):
    if a[i] > 0 and start ==0:
        a_Start.append(i)
        start = 1
    if a[i] <= 0 and start == 1:
        a_End.append(i)
        start = 0

#分割行,分割之后再进行列分割并保存分割位置
for i in range(len(a_Start)):
    #获取行图像
    cropImg = image2[a_Start[i]:a_End[i], 0:w1]
    #对行图像进行垂直投影
    bstart = 0
    bend = 0
    b_Start = 0
    b_End = 0
    for j in range(len(b)):
        if b[j] > 0 and bstart ==0:
            b_Start =j
            bstart = 1
            bend=0
        if b[j] <= 0 and bstart == 1:
            b_End =j
            bstart = 0
            bend=1
        if bend == 1:
            Position.append([b_Start,a_Start[i],b_End,a_End[i]])
            bend =0
image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)#将灰度图转为RGB彩图

#根据确定的位置分割字符
for m in range(len(Position)):
    cv2.rectangle(image2, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0, 0, 255), 2)#第一个参数是原图;第二个参数是矩阵的左上点坐标;第三个参数是矩阵的右下点坐标;第四个参数是画线对应的rgb颜色;第五个参数是所画的线的宽度
cv2.imshow('rect',image2)
cv2.waitKey(0)

2.运行结果

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

Python中OpenCV实现简单车牌字符切割

3. 遇到的问题及解决方法

对于二值化后的灰度图,在确定了各个字符坐标后,使用cv2.rectangle()方法画矩形框:cv2.rectangle(image2, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0, 255, 0), 2)。其中,第一个参数表示原图,第二个参数表示矩阵的左上点坐标,第三个参数表示矩阵的右下点坐标;第四个参数是画线对应的RGB颜色,第五个参数是画线宽度。在设置RGB颜色时发现矩形框颜色只能显示为黑色和白色,原因是在二值图上画图颜色没有三通道,无法显示彩色图像。

解决方法:将灰度图转换为RGB彩图。代码为image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)。

到此这篇关于Python中OpenCV实现简单车牌字符切割的文章就介绍到这了,更多相关OpenCV 车牌字符切割内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python操作Word批量生成文章的方法
Jul 28 Python
Python实现自动登录百度空间的方法
Jun 10 Python
python正则表达式re之compile函数解析
Oct 25 Python
python3学习笔记之多进程分布式小例子
Feb 13 Python
python try except 捕获所有异常的实例
Oct 18 Python
对python中if语句的真假判断实例详解
Feb 18 Python
OpenCV 边缘检测
Jul 10 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
python中的subprocess.Popen()使用详解
Dec 25 Python
python中什么是面向对象
Jun 11 Python
python代码区分大小写吗
Jun 17 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
Vue指令指令大全
2019/02/09 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python同时替换多个字符串方法示例
2019/09/17 Python
大学生职业生涯规划书范文
2014/01/14 职场文书
小学敬老月活动方案
2014/02/11 职场文书
给校长的建议书400字
2014/05/15 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
介绍信模板
2015/01/31 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL