图像识别练习(字符验证码、车牌号、身份证号)

图像识别练习(字符验证码、车牌号、身份证号)

© 野比 2012

欢迎大家和我讨论相关问题。联系方式:1429013154

代码在此(注意此版并非最终版)

光学字符识别(OCR)是非常有用的技术。在验证码识别、车牌号识别、文字识别方面,基于字符的识别技术算是比较容易上手的了(相比图文识别)。

闲来看到有朋友研究验证码识别,一时手痒,野比自己动手来做做验证码识别。当然,肯定只是简单的验证码。

名为验证码,实际上并不限于,还可以识别车牌号、身份证号、门牌号等各种乱七八糟的内容。

识别的流程很明确:

1、预处理图像

2、做y轴的投影

3、分析直方图分区

4、根据分区拆分图像为多个字符(很关键,拆得越好,后续识别率越高)

5、丢弃空白或无效字符

6、自动旋转字符(如果有倾斜),识别字符

如果样本中个图像有粘连,则可能造成分区不准确。这种情况下,需要进行旋转,但是怎样自动旋转,是个难题。

目前已可拆分出字符,下一步准备研究如何识别。(如果单个字符比较规范,可以利用现成的OCR控件)

这里有一些例子。

普通的验证码(毫无难度)

带干扰的验证码

较高强度干扰(目前使用的分区算法不能解决,需要更好的算法,比如动态阈值)

CSDN的验证码(毫无压力)

身份证号码

车牌号

补充个QQ验证码,用单一阈值方法,识别很困难,需要结合字符宽度进行判断

这是单一阈值分区的结果(没有限制宽度),可以看到效果很差。

继续研究如何优化分区算法,如何识别单个文字(可以考虑多重识别+样本训练)。

 

附上太平洋网站验证码。

有些粘连,但是可以通过固定字符宽度解决(宽度基本一致)

参考这张图(获得整个宽度,然后除以字符数得到每个宽度,分别提取)

二值化我用的Otsu算法,参考文献:"A threshold selection method from gray-level histograms", IEEE Trans. Systems, Man and Cybernetics 9(1), pp. 62–66, 1979

关于验证码,这篇论文很不错,建议参考:"Text-based CAPTCHA Strengths and Weaknesses", ACM Computer and Communication security 2011 (CSS'2011)

© 野比 2012

改进的去污算法

 

污损车牌号拆分字符

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Sure! 下面是一个传统图像识别车牌字符分割的示例代码: ```python import cv2 import numpy as np # 读取车牌图像 image = cv2.imread('car_plate.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 对图像进行预处理,使用高斯模糊和二值化操作 blurred = cv2.GaussianBlur(gray, (5, 5), 0) _, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 使用形态学操作进行图像处理,去除噪声 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=2) closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel, iterations=2) # 寻找轮廓 contours, _ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 根据轮廓的大小进行字符分割 char_boxes = [] for contour in contours: (x, y, w, h) = cv2.boundingRect(contour) aspect_ratio = w / float(h) if 1.5 <= aspect_ratio <= 5.5 and h >= 30 and h <= 80 and w >= 10 and w <= 50: char_boxes.append((x, y, w, h)) # 根据字符框位置进行排序 char_boxes = sorted(char_boxes, key=lambda x: x[0]) # 裁剪字符并显示 for box in char_boxes: (x, y, w, h) = box cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) char_image = closed[y:y + h, x:x + w] cv2.imshow("Character", char_image) cv2.waitKey(0) cv2.imshow("License Plate", image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码使用了OpenCV库进行图像处理和字符分割。首先,通过高斯模糊和二值化操作对图像进行预处理,然后使用形态学操作去除噪声。接下来,寻找轮廓,并根据轮廓的大小进行字符分割。最后,根据字符框的位置进行排序,并将字符框绘制在车牌图像上显示出来。 这只是一个简单的示例代码,实际应用中可能需要根据具体情况进行参数调整和优化。希望对你有帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值