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模拟enum枚举类型的方法小结
Apr 30 Python
Python实现简单的代理服务器
Jul 25 Python
详解用python实现简单的遗传算法
Jan 02 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
Python3处理HTTP请求的实例
May 10 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
python儿童学游戏编程知识点总结
Jun 03 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
python从Oracle读取数据生成图表
Oct 14 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
PHP中的cookie
2006/11/26 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
php生成微信红包数组的方法
2019/09/05 PHP
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
VUE中的无限循环代码解析
2017/09/22 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
工作会议欢迎词
2014/01/16 职场文书
优秀士兵个人事迹材料
2014/01/19 职场文书
拓展策划方案
2014/06/03 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书