Python中OpenCV实现简单车牌字符切割
作者:圈er 发布时间:2023-09-19 18:53:59
标签:OpenCV,车牌,字符,切割
在Jupyter Notebook上使用Python+opencv实现如下简单车牌字符切割。关于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.运行结果
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)。
来源:https://www.cnblogs.com/BIXIABUMO/p/12824111.html
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- Go 在testing包中内置测试命令go test,提供了最小化但完整的测试体验。标准工具链还包括基准测试和基于代码覆盖的语句,类似于NC
- 一、问题描述通过调用MyQR模块来实现生成个人所需二维码。安装:pip install myqr二、代码实现1.普通二维码from MyQR
- 自己有一套模块化的思路,想搜索一下有没有共鸣结果排名靠前的是通过class拼凑页面的想法。模块化是twinsen提出来的,从我接收第一个po
- 1.Python的基本数据类型数据类型想必大家都知道是什么含义,指的是输入数据的类型,任何数据都有明确的数据类型,例如我们输入100,这个数
- 安装jieba库教程jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,
- 在oracle中有很多关于日期的函数,如:1、add_months()用于从一个日期值增加或减少一些月份date_value:=add_mo
- 目录一、网址分析二、代码编写三、遇到的问题1. 获取评论的时候也将子评论爬虫进去了。2. 获取全部评论数,直接通过 requests 获取不
- 我在使用conda安装虚拟环境的过程中,下载一些包,比如torch等,发现在虚拟环境中有一份以外,pkgs文件夹下同样也会出现一份,大小一样
- 平时工作过程中,git在push代码的时候有时会遇到如下的错误错误原因文件冲突,本地的代码和远程Repository中的文件个数不一致(即远
- 在一般的情况下,使用批量fetch的几率并不是很多,但是Oracle提供了这个功能我们最好能熟悉一下,说不定什么时候会用上它。declare
- 在jupyter notebook或者是 Qtconsole下编译运行一个简单的pyqt程序,总是报错:The kernel appears
- IE下window.lcoation可以被重写而不重新定向,具体方法是: var location = {},然后就可以重写具体的属性了,这
- 在部署一套内网测试环境时,频繁宕机,开机后不断的吃内存,重启apache之后内存占用会不停的上涨,直到swap用完,直到死机,由于是内网环境
- 前言所谓“基础不狠,人站不稳”,对于任何一种编程语言来说基础往往都是重中之重,以Python为例,其
- 本文实例讲述了python检查字符串是否是正确ISBN的方法。分享给大家供大家参考。具体实现方法如下:def isISBN(isbn):
- 1. list查询个数:调用list.count(obj)函数,返回obj在list中的个数。输入:list_a = [2 for x in
- Django根据已有数据库表反向生成models类一. 创建一个Django项目django-admin startproject ‘xxx
- ASP中给函数传参确实是个麻烦事,当参数个数特别多的时候(比如有七八个或者更多的参数个数)差不多就要眼冒金星了,一个个的数吧。而且要命的是参
- 本文实例为大家分享了TensorFlow实现Logistic回归的具体代码,供大家参考,具体内容如下1.导入模块import numpy a
- 网上有很多关于科学计算包sympy的介绍,这里我把官方文档的英文表述贴过来。简单翻译就是sympy是个代数系统,底层完全使用python语言