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中实现指定时间调用函数示例代码
Sep 08 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
python实现最小二乘法线性拟合
Jul 19 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
Python count函数使用方法实例解析
Mar 23 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 Python
Python编解码问题及文本文件处理方法详解
Jun 20 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 Python
Python简易开发之制作计算器
Apr 28 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
详解python的数字类型变量与其方法
2016/11/20 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
python中for用来遍历range函数的方法
2018/06/08 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
PyTorch预训练的实现
2019/09/18 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
python实现简单的tcp 文件下载
2020/09/16 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
python 获取计算机的网卡信息
2021/02/18 Python
HTML5探秘:用requestAnimationFrame优化Web动画
2018/06/03 HTML / CSS
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
《桂花雨》教学反思
2014/04/12 职场文书
大型会议策划方案
2014/05/17 职场文书
放飞理想演讲稿
2014/09/09 职场文书
出纳试用期自我评价
2015/03/10 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android