java车牌识别字符分割_【车牌识别】-车牌中字符分割代码详解
1 ### 对车牌图片进行处理,分割出车牌中的每一个字符并保存
2 #在本地读取图片的时候,如果路径中包含中文,会导致读取失败。
3
4 importcv25 importpaddle6 importnumpy as np7 importmatplotlib.pyplot as plt8 #以下两行实现了在plt画图时,可以输出中文字符
9 plt.rcParams['font.sans-serif']=['SimHei']10 plt.rcParams['axes.unicode_minus'] =False11
12
13 #cv2.imread() 读进来直接是BGR 格式数据,数值范围在 0~255 。在本地读取,路径中不要含有中文
14 license_plate = cv2.imread('../data/car.png') #license 拍照,plate 车牌
15 print('license_plate 的 type', type(license_plate), license_plate.shape) # (170, 722, 3)
16
17 plt.subplot(231)18 plt.imshow(license_plate)19 plt.title('原图 BGR')20
21 gray_plate2 = cv2.cvtColor(license_plate, cv2.COLOR_BGR2RGB) #RGB 转灰度图
22 plt.subplot(234)23 plt.imshow(gray_plate2)24 plt.title('RGB图像')25 #cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式。
26 #cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
27 #cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片(灰度图片并不是指常规意义上的黑白图片,只用看是不是无符号八位整型(unit8),单通道即可判断)
28 gray_plate = cv2.cvtColor(license_plate, cv2.COLOR_RGB2GRAY) #RGB 转灰度图
29 print('gray_plate.shape', gray_plate.shape) #(170, 722)
30
31 plt.subplot(232)32 plt.imshow(gray_plate)33 plt.title('GRAY 图像')34
35 #Python: cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
36 #src:表示的是图片源
37 #thresh:表示的是阈值(起始值)
38 #maxval:表示的是最大值,在高于阈值是赋予的新值
39 #type:表示的是这里划分的时候使用的是什么类型的算法**,常用值为0(cv2.THRESH_BINARY)
40 #cv2.THRESH_BINARY 大于阈值取最大值 maxval ,小于等于阈值取 0
41 #两个返回值,第一个retVal(得到的阈值值(在后面一个方法中会用到)),第二个就是阈值化后的图像。
42 ret, binary_plate = cv2.threshold(gray_plate, 175, 255, cv2.THRESH_BINARY) #ret:阈值,binary_plate:根据阈值处理后的图像数据
43 print('ret', ret) #175.0
44 print('binary_plate', binary_plate.shape ) #(170, 722)
45
46 plt.subplot(233)47 plt.imshow(binary_plate)48 plt.title('阈值处理之后的图像')49
50 #按列统计像素分布
51 result =[]52 for col in range(binary_plate.shape[1]):53 result.append(0) #每一列像素值初始化为 0
54 for row inrange(binary_plate.shape[0]):55 result[col] = result[col] + binary_plate[row][col] / 255
56 #print(result)
57 #记录车牌中字符的位置
58 character_dict = {} #character_dict 是一个字典,里面一个元素中的value 部分存储一个车牌中的字符
59 num = 0 #记录统计的车牌中的第几个字符,同时是 字典 character_dict 中的 key 值
60 i = 0 #表示是第几列像素
61 while i
63 if result[i] ==0:64 i += 1
65 else:66 index = i + 1
67 while result[index] !=0:68 index += 1
69 #第 i 列 到 第 index-1 列,存储了一个字符,这里做了一个假设像 “ 桂 ” 这样左右结构的字,在列的方向上是没有像素断点的
70 #character_dict 是一个字典,num 是字典的 key,[i, index - 1] 是一个存储了两个数的列表作为字典的value
71 character_dict[num] = [i, index - 1]72 num += 1
73 i =index74 print('character_dict', character_dict)75
76 #将每个字符填充,并存储
77 characters =[]78 for i in range(8): #车牌一共 8 个字符,其中第 3 个字符(下标为 2 )是一个 ·
79 if i == 2:80 continue
81 #将字符填充为 170*170 的灰度图,padding 为计算左右需要各自填充多少列元素
82 padding = (170 - (character_dict[i][1] - character_dict[i][0])) / 2
83
84 #np.pad() 函数原型:ndarray = numpy.pad(array, pad_width, mode, **kwargs)
85 #array为要填补的数组
86 #pad_width 是在各维度的各个方向上想要填补的长度,如((1,2),(2,2)),
87 #表示在第一个维度上水平方向上padding=1,垂直方向上padding=2, 在第二个维度上水平方向上padding=2,垂直方向上padding=2。
88 #如果直接输入一个整数,则说明各个维度和各个方向所填补的长度都一样。
89 #mode为填补类型,即怎样去填补,有“constant”,“edge”等模式,如果为constant模式,就得指定填补的值,如果不指定,则默认填充0。
90 #剩下的都是一些可选参数,具体可查看
91 #https://docs.scipy.org/doc/numpy/reference/generated/numpy.pad.html
92
93 #ndarray为填充好的返回值。
94 ndarray = np.pad(binary_plate[:, character_dict[i][0]:character_dict[i][1]], #array : 为要填补的数组
95 #pad_width:在各维度的各个方向上想要填补的长度。在第一个维度(行)前面填充 0 行,后面填充 0 行;
96 #在第二个维度(列)前面填充 padding 列 后面填充 padding 列
97 ((0, 0), (int(padding), int(padding))),98 #mode为填补类型,即怎样去填补,有“constant”,“edge”等模式,
99 #如果为constant模式,就得指定填补的值,如果不指定,则默认填充0。
100 'constant', constant_values=(0, 0)101 )102 print('第 {} 个字符'.format(i+1))103 print('原数组尺寸 :', binary_plate[:, character_dict[i][0]:character_dict[i][1]].shape)104 print('填充之后的尺寸 :', ndarray.shape)105 ndarray = cv2.resize(ndarray, (20, 20))106 print('resize 之后的尺寸 :', ndarray.shape)107
108 cv2.imwrite('../data/' + str(i) + '.png', ndarray)109 characters.append(ndarray)110 ndarray2 = cv2.resize(binary_plate[:, character_dict[i][0]:character_dict[i][1]], (20, 20))111 cv2.imwrite('../data/2' + str(i) + '.png', ndarray)112
113 plt.show()114
115
116 '''输出结果:117 license_plate 的 type (170, 722, 3)118 gray_plate.shape (170, 722)119 ret 175.0120 binary_plate (170, 722)121 character_dict {0: [17, 87], 1: [109, 179], 2: [203, 216], 3: [240, 311], 4: [334, 406], 5: [430, 503], 6: [528, 603], 7: [629, 706]}122
123 第 1 个字符124 原数组尺寸 : (170, 70)125 填充之后的尺寸 : (170, 170)126 resize 之后的尺寸 : (20, 20)127 第 2 个字符128 原数组尺寸 : (170, 70)129 填充之后的尺寸 : (170, 170)130 resize 之后的尺寸 : (20, 20)131 第 4 个字符132 原数组尺寸 : (170, 71)133 填充之后的尺寸 : (170, 169)134 resize 之后的尺寸 : (20, 20)135 第 5 个字符136 原数组尺寸 : (170, 72)137 填充之后的尺寸 : (170, 170)138 resize 之后的尺寸 : (20, 20)139 第 6 个字符140 原数组尺寸 : (170, 73)141 填充之后的尺寸 : (170, 169)142 resize 之后的尺寸 : (20, 20)143 第 7 个字符144 原数组尺寸 : (170, 75)145 填充之后的尺寸 : (170, 169)146 resize 之后的尺寸 : (20, 20)147 第 8 个字符148 原数组尺寸 : (170, 77)149 填充之后的尺寸 : (170, 169)150 resize 之后的尺寸 : (20, 20)151 '''
java车牌识别字符分割_【车牌识别】-车牌中字符分割代码详解相关推荐
- java 找出重复的数据_java 查找list中重复数据实例详解
java 查找list中重复数据实例详解 需求: 查找一个list集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...
- java微信支付必要参数_微信支付 开发账号体系各参数详解
商户在微信公众平台提交申请资料以及银行账户资料,资料审核通过并签约后,可以获得表6-4所示帐户(包含财付通的相关支付资金账户),用于公众帐号支付. 帐号及作用: appid :公众帐号身份的唯一标识. ...
- java 自动生成mybatis文件_如何自动生成Mybatis的Mapper文件详解
前言 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,mybatis官方也发现了这个问题,因此给我 ...
- latex中if语句怎么用_如果 (If) | Python 中的条件控制语句详解
点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐,生活中 ...
- 在 if...elif...else 的多个语句块中只会执行一个语句块?_如果 (If) | Python 中的条件控制语句详解...
点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐,生活中 ...
- woe分析_信用评分模型中WOE、IV详解
IV(informaiton Value) IV的概念 IV全程是informaiton Value,中文意思是信息价值,或者信息量. 在逻辑回归.决策树等模型方法构建分类模型时,经常需要对自变量进行 ...
- gb2312 java编码几个字节_彻底搞懂乱码——字符,字节和编码
级别:中级 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解.举例说明了一些实际应用中,编码的实现方法.然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱 ...
- 【OpenCV/C++】KNN算法识别数字的实现原理与代码详解
KNN算法识别数字 一.KNN原理 1.1 KNN原理介绍 1.2 KNN的关键参数 二.KNN算法识别手写数字 2.1 训练过程代码详解 2.2 预测分类的实现过程 三.KNN算法识别印刷数字 2. ...
- BilSTM 实体识别_NLP-入门实体命名识别(NER)+Bilstm-CRF模型原理Pytorch代码详解——最全攻略
最近在系统地接触学习NER,但是发现这方面的小帖子还比较零散.所以我把学习的记录放出来给大家作参考,其中汇聚了很多其他博主的知识,在本文中也放出了他们的原链.希望能够以这篇文章为载体,帮助其他跟我一样 ...
- BilSTM 实体识别_NLP入门实体命名识别(NER)+BilstmCRF模型原理Pytorch代码详解——最全攻略...
来自 | 知乎 作者 | seven链接 | https://zhuanlan.zhihu.com/p/79552594编辑 | 机器学习算法与自然语言处理公众号本文仅作学术分享,如有侵权,请联系 ...
最新文章
- Esper学习之十二:EPL语法(八)
- 20145223 《信息安全系统设计基础》课程总结
- 282021年湖南高考成绩查询,2010年湖南高考成绩查询
- 李国浩20179307第二周作业
- 使用ASP.NET核心应用程序实现存储库模式和工作单元的指南
- ASP.Net学习笔记014--ViewState初探3
- js复制隐藏域中的文字
- 黑苹果系统引导工具正确安装步骤
- 谷歌开源谷歌地球企业版源码
- jar包双击打不开或者闪退的解决办法
- [Swust OJ 643]--行列式的计算(上三角行列式变换)
- 一步一步教你将java代码打成jar包用bat批处理命令运行
- 测试开发之Python核心笔记(15):迭代器与生成器
- 使用 dcm4che 操作 Dicom 文件
- html 图片自动滚动播放,javascript+html5实现仿flash滚动播放图片的方法
- 第六十九章 SQL函数 JSON_OBJECT
- sudo:无法解析主机 解决方案
- 浅谈多线程——NSOperation
- 统计一下我的CV方向可以投的期刊和会议
- 学习JavaScript之前,这些知识你应该知道?