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批量导出导入MySQL用户的方法
Nov 15 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
如何用python整理附件
May 13 Python
Python学习小技巧总结
Jun 10 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
Python动态导入模块和反射机制详解
Feb 18 Python
Python requests设置代理的方法步骤
Feb 23 Python
Pandas数据分析的一些常用小技巧
Feb 07 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
法压式咖啡之制作法
2021/03/03 冲泡冲煮
PHP 变量定义和变量替换的方法
2009/07/30 PHP
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
jquery实现手风琴效果实例代码
2013/11/15 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
Python 性能优化技巧总结
2016/11/01 Python
对python字典过滤条件的实例详解
2019/01/22 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
python nmap实现端口扫描器教程
2020/05/28 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
自我评价的写作规则
2014/01/06 职场文书
环境建设实施方案
2014/03/14 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
工作检讨书怎么写
2014/10/10 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
合作意向书范本
2019/04/17 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers