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的chardet库获得文件编码并修改编码
Jan 22 Python
在Python中处理日期和时间的基本知识点整理汇总
May 22 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
python将数组n等分的实例
Dec 02 Python
基于python3生成标签云代码解析
Feb 18 Python
python GUI计算器的实现
Oct 09 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
Python下opencv库的安装过程及问题汇总
Jun 11 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
php实现对象克隆的方法
2015/06/20 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
pyqt和pyside开发图形化界面
2014/01/22 Python
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
python实现键盘输入的实操方法
2019/07/16 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
Python对wav文件的重采样实例
2020/02/25 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
python 串行执行和并行执行实例
2020/04/30 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
安全员岗位职责
2013/11/11 职场文书
党员大会主持词
2014/04/02 职场文书
信访维稳工作汇报
2014/10/27 职场文书
工作检讨书怎么写
2015/01/23 职场文书
导游词开场白
2015/01/31 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
感恩主题班会教案
2015/08/12 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
Java死锁的排查
2022/05/11 Java/Android