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中的线程进行网络编程的入门教程
Apr 15 Python
python写入中英文字符串到文件的方法
May 06 Python
Python中functools模块的常用函数解析
Jun 30 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
Python字典及字典基本操作方法详解
Jan 30 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
Apr 26 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 Python
深入了解Django中间件及其方法
Jul 26 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
Python实现抖音热搜定时爬取功能
Mar 16 Python
Python实现数据的序列化操作详解
Jul 07 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
PHP导入导出Excel代码
2015/07/07 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
javascript json2 使用方法
2010/03/16 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
pytorch实现查看当前学习率
2020/06/24 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
武汉东之林科技有限公司机试
2013/09/17 面试题
求职自荐书范文
2013/12/04 职场文书
实习老师离校感言
2014/02/03 职场文书
工作分析计划书
2014/04/30 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
社区先进事迹材料
2014/05/19 职场文书
2014年端午节演讲稿范文
2014/05/23 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
小学校长开学致辞
2015/07/29 职场文书