完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
【MYD-JX8MMA7】 十三、OpenCV 车牌分割 一、基本原理 分割车牌是用于将车牌中的汉字字符、英文字符、阿拉伯数字字符提取出来,以便后续的识别。通常情况下,需要先对图像进行预处理(主要是进行去噪、二值化、膨胀等操作)以便提取每个字符的轮廓。 对分割车牌的各个流程进行具体介绍: 去噪:操作的目的是去除图像内的噪声,可以使用函数GaussianBlur完成。 灰度:操作将图像由彩色图像处理为灰度图像,以便进行后续操作,可以使用函数cvtColor完成。 二值化:对图像进行阈值处理,将其处理为二值图像,以便进行后续操作,可以使用函数threshold完成。 膨胀:通常情况下,字符的各个笔画之间是分离的,通过膨胀操作可以让个字符形成一个整体。膨胀操作可通过函数dilate实现。 轮廓:操作用来查找图像内的所有轮廓,可以使用函数findContours完成,此时找到的轮廓非常多,既包含每个字符的轮廓,又包含噪声的轮廓,下一步工作是将字符的轮廓筛选出来。 包围框:操作让每个轮廓都被包围框包围,可以通过函数boundingRect完成。使用包围框替代轮廓的目的是,通过包围框的高宽比及宽度值,可以很方便的判定一个包围框包含的是噪声还是字符。 分割:逐个遍历包围框,将其中宽高比在指定范围内、宽度大于特定值的包围框判定为字符。操作可通过循环语句内置判断条件实现。 二、代码实现 # -*- coding: utf-8 -*- import cv2 #=====读取车牌===== image=cv2.imread("car1.bmp") o=image.copy() #复制原始图像,用于绘制轮廓用 cv2.imshow("original",image) #=============图像预处理=============== # -------图像去噪灰度处理F1------- image = cv2.GaussianBlur(image, (3, 3), 0) cv2.imshow("GaussianBlur",image) # -------色彩空间转换F2------- grayImage = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) cv2.imshow("gray",grayImage) # -------阈值处理(二值化)F3 ------- ret, image = cv2.threshold(grayImage, 0, 255, cv2.THRESH_OTSU) cv2.imshow("threshold",image) #-------膨胀处理F4,让一个字构成一个整体(大多数字不是一体的,是分散的)-------- kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) image = cv2.dilate(image, kernel) cv2.imshow("dilate",image) #=============拆分车牌,将车牌内各个字符分离=============== # -------查找轮廓F5,各个字符的轮廓及噪声点轮廓--------------- contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) x = cv2.drawContours(o.copy(), contours, -1, (0, 0, 255), 1) cv2.imshow("contours",x) print("共找到轮廓个数:",len(contours)) #测试语句:看看找到多少个轮廓 # -------------遍历所有轮廓,寻找最小包围框F6------------------ chars = [] for item in contours: rect = cv2.boundingRect(item) x,y,w,h = cv2.boundingRect(item) chars.append(rect) cv2.rectangle(o,(x,y),(x+w,y+h),(0,0,255),1) cv2.imshow("contours2",o) # --------------将包围框按照x轴坐标值排序(自左向右排序)-------------- chars = sorted(chars,key=lambda s:s[0],reverse=False) # --------将字符的轮廓筛选出来F7------------------- #逐个遍历包围框,高宽比在1.5-8之间,宽度大于3个像素,判定为字符 plateChars = [] for word in chars: if (word[3] > (word[2] * 1.5)) and (word[3] < (word[2] * 8)) and (word[2] > 3): plateChar = image[word[1]:word[1] + word[3], word[0]:word[0] + word[2]] plateChars.append(plateChar) # --------------测试语句:查看各个字符------------------- for i,im in enumerate(plateChars): cv2.imshow("char"+str(i),im) cv2.waitKey() cv2.destroyAllWindows() 三、准备的图像文件 车牌图像,实际为上一个环节识别到的车牌文件,此步骤使用的是.Bmp文件格式,可以使用画图软件将其转换一下。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【米尔-Xilinx XC7A100T FPGA开发板试用】 UART测试
535 浏览 0 评论
【米尔RK3576开发板评测】+项目名称米尔RK3576开发板人脸疲劳检测代码测试
689 浏览 0 评论
【米尔RK3576开发板评测】+项目名称值得购买的米尔RK3576开发板
649 浏览 0 评论
【米尔RK3576开发板评测】+项目名称2、基于gstreamer + mpp硬件编码 实现摄像头推流
1108 浏览 0 评论
【米尔-紫光MYB-J7A100T国产FPGA开发板试用】米尔-紫光PG2L100H国产FPGA开发板开箱评测
1166 浏览 0 评论
【米尔-瑞米派兼容树莓派扩展模块-试用体验】基于ROS系统的三麦轮小车自主导航
3715浏览 2评论
【米尔NXP i.MX 93开发板试用评测】5、安装Debian和排除启动故障
836浏览 2评论
【米尔NXP i.MX 93开发板试用评测】2、异构通信环境搭建和源码编译
970浏览 2评论
【米尔-瑞米派兼容树莓派扩展模块-试用体验】Free RTOS应用开发环境部署
1500浏览 1评论
【米尔-芯驰D9开发板- 国产平台试用】- 03- 外设接口测试-U盘、485总线
6847浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-13 23:32 , Processed in 0.520903 second(s), Total 39, Slave 31 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号