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 相关文章推荐
使用graphics.py实现2048小游戏
Mar 10 Python
python类继承与子类实例初始化用法分析
Apr 17 Python
Ubuntu下安装PyV8
Mar 13 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
python实现动态创建类的方法分析
Jun 25 Python
python将字符串转变成dict格式的实现
Nov 18 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
python语言的优势是什么
Jun 17 Python
python文件排序的方法总结
Sep 13 Python
python中validators库的使用方法详解
Sep 23 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
PHP insert语法详解
2008/06/07 PHP
php set_magic_quotes_runtime() 函数过时解决方法
2010/07/08 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
python中列表元素连接方法join用法实例
2015/04/07 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
美德好少年事迹材料
2014/01/19 职场文书
局火灾防控工作方案
2014/05/25 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
教师岗位职责范本
2015/04/02 职场文书
飞越疯人院观后感
2015/06/09 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python