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车牌识别字符分割_【车牌识别】-车牌中字符分割代码详解相关推荐

  1. java 找出重复的数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个list集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  2. java微信支付必要参数_微信支付 开发账号体系各参数详解

    商户在微信公众平台提交申请资料以及银行账户资料,资料审核通过并签约后,可以获得表6-4所示帐户(包含财付通的相关支付资金账户),用于公众帐号支付. 帐号及作用: appid :公众帐号身份的唯一标识. ...

  3. java 自动生成mybatis文件_如何自动生成Mybatis的Mapper文件详解

    前言 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,mybatis官方也发现了这个问题,因此给我 ...

  4. latex中if语句怎么用_如果 (If) | Python 中的条件控制语句详解

    点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐,生活中 ...

  5. 在 if...elif...else 的多个语句块中只会执行一个语句块?_如果 (If) | Python 中的条件控制语句详解...

    点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐,生活中 ...

  6. woe分析_信用评分模型中WOE、IV详解

    IV(informaiton Value) IV的概念 IV全程是informaiton Value,中文意思是信息价值,或者信息量. 在逻辑回归.决策树等模型方法构建分类模型时,经常需要对自变量进行 ...

  7. gb2312 java编码几个字节_彻底搞懂乱码——字符,字节和编码

    级别:中级 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解.举例说明了一些实际应用中,编码的实现方法.然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱 ...

  8. 【OpenCV/C++】KNN算法识别数字的实现原理与代码详解

    KNN算法识别数字 一.KNN原理 1.1 KNN原理介绍 1.2 KNN的关键参数 二.KNN算法识别手写数字 2.1 训练过程代码详解 2.2 预测分类的实现过程 三.KNN算法识别印刷数字 2. ...

  9. BilSTM 实体识别_NLP-入门实体命名识别(NER)+Bilstm-CRF模型原理Pytorch代码详解——最全攻略

    最近在系统地接触学习NER,但是发现这方面的小帖子还比较零散.所以我把学习的记录放出来给大家作参考,其中汇聚了很多其他博主的知识,在本文中也放出了他们的原链.希望能够以这篇文章为载体,帮助其他跟我一样 ...

  10. BilSTM 实体识别_NLP入门实体命名识别(NER)+BilstmCRF模型原理Pytorch代码详解——最全攻略...

    来自 | 知乎   作者 | seven链接 | https://zhuanlan.zhihu.com/p/79552594编辑 | 机器学习算法与自然语言处理公众号本文仅作学术分享,如有侵权,请联系 ...

最新文章

  1. Esper学习之十二:EPL语法(八)
  2. 20145223 《信息安全系统设计基础》课程总结
  3. 282021年湖南高考成绩查询,2010年湖南高考成绩查询
  4. 李国浩20179307第二周作业
  5. 使用ASP.NET核心应用程序实现存储库模式和工作单元的指南
  6. ASP.Net学习笔记014--ViewState初探3
  7. js复制隐藏域中的文字
  8. 黑苹果系统引导工具正确安装步骤
  9. 谷歌开源谷歌地球企业版源码
  10. jar包双击打不开或者闪退的解决办法
  11. [Swust OJ 643]--行列式的计算(上三角行列式变换)
  12. 一步一步教你将java代码打成jar包用bat批处理命令运行
  13. 测试开发之Python核心笔记(15):迭代器与生成器
  14. 使用 dcm4che 操作 Dicom 文件
  15. html 图片自动滚动播放,javascript+html5实现仿flash滚动播放图片的方法
  16. 第六十九章 SQL函数 JSON_OBJECT
  17. sudo:无法解析主机 解决方案
  18. 浅谈多线程——NSOperation
  19. 统计一下我的CV方向可以投的期刊和会议
  20. 学习JavaScript之前,这些知识你应该知道?

热门文章

  1. 企业级项目实战讲解!Java获取某个日期的前一天
  2. ajaxSubmit异步提交
  3. 基地保留节目--塔防游戏
  4. Oracle常用函数
  5. 粒子群优化算法及MATLAB实现
  6. 算法精解----快速排序2
  7. m4s格式转换mp3_AnyMP4 MP3 Converter for Mac(mp3格式转换器)
  8. IDEA / webstorm 破解
  9. oracle打开dmp文件乱码,oracle中导入dmp字符乱码分析和解决方案
  10. 模拟电路中晶体管阵列的性能感知公共质心布局和布线 ALIGN