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中装饰器的使用
Jul 12 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
Django中信号signals的简单使用方法
Jul 04 Python
解决yum对python依赖版本问题
Jul 05 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
关于python的缩进规则的知识点详解
Jun 22 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
详解Python自动化之文件自动化处理
Jun 21 Python
Python排序算法之插入排序及其优化方案详解
Python下opencv库的安装过程及问题汇总
Jun 11 #Python
Python实现信息轰炸工具(再也不怕说不过别人了)
撤回我也能看到!教你用Python制作微信防撤回脚本
用Python创建简易网站图文教程
python+opencv实现视频抽帧示例代码
用Python将GIF动图分解成多张静态图片
You might like
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
python list使用示例 list中找连续的数字
2014/01/27 Python
浅谈Python的垃圾回收机制
2016/12/17 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python批量图片处理简单示例
2019/08/06 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
给物业的表扬信
2014/01/21 职场文书
秘书英文求职信
2014/04/16 职场文书
个人违纪检讨书
2014/09/15 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
内勤岗位职责范本
2015/04/13 职场文书
2016年元旦主持词
2015/07/06 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
生日祝酒词大全
2015/08/10 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
在Python中如何使用yield
2021/06/07 Python
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers