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中的内置函数getattr()介绍及示例
Jul 20 Python
跟老齐学Python之深入变量和引用对象
Sep 24 Python
python实现名片管理系统
Nov 29 Python
python爬虫获取新浪新闻教学
Dec 23 Python
python实现按行分割文件
Jul 22 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
python实现交并比IOU教程
Apr 16 Python
jupyter实现重新加载模块
Apr 16 Python
Python几种常见算法汇总
Jun 02 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
Python办公自动化解决world文件批量转换
Sep 15 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
PHP PDOStatement::fetchObject讲解
2019/02/01 PHP
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
Jquery性能优化详解
2014/05/15 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Python中数字以及算数运算符的相关使用
2015/10/12 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
python区块及区块链的开发详解
2019/07/03 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
毕业实习个人鉴定范文
2013/12/10 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
大学校园生活自我鉴定
2014/01/13 职场文书
学校门卫管理制度
2014/01/30 职场文书
对孩子的寄语
2014/04/09 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
法人代表证明书格式
2014/10/01 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
Element实现动态表格的示例代码
2021/08/02 Javascript
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers