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制作爬虫爬取京东商品评论教程
Dec 16 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
python的turtle库使用详解
May 10 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
Python切图九宫格的实现方法
Oct 10 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
Python eval函数原理及用法解析
Nov 14 Python
去除python中的字符串空格的简单方法
Dec 22 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
php使用qr生成二维码的示例分享
2014/01/20 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
学生周末回家住宿长期请假条
2014/02/15 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
李培根演讲稿
2014/05/22 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
倡议书范文大全
2015/04/28 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python