OpenCV入门之获取验证码的单个字符(字符切割)
介绍
在我们日常上网注册账号以及制作网络爬虫时,经常会遇到奇奇怪怪的验证码,有些容易,有些连人眼都无法辨识。于是,大牛们想到了用深度学习的方法来破解验证码,对于一般的验证码往往能出奇制胜,取得不俗的识别效果。对于利用深度学习方法识别验证码,其预处理就是获取验证码中的单个字符,即字符切割。
本文将通过一个简单的验证码例子,来展示如何利用OpenCV来获取单个字符。
手把手教学
我们所使用的示例验证码如下:
首先我们在OpenCV中以灰度模式读取图片(imagepath为图片所在的绝对路径),
gray = cv2.imread(imagepath, 0)
处理后的图片如下:
接着我们把该验证码的边缘设置为白色(255代表白色),
# 将图片的边缘变为白色
height, width = gray.shape
for i in range(width):
gray[0, i] = 255
gray[height-1, i] = 255
for j in range(height):
gray[j, 0] = 255
gray[j, width-1] = 255
处理后的图片效果如下:
可以看到,处理后的图片的边缘部分已经置为白色了。
接着我们需要对图像进行滤波处理,图像滤波的主要目的是为了在保留图像细节的情况下尽量的对图像的噪声进行消除,从而是后来的图像处理变得更加的方便。我们在这里采用中值滤波(median blur)的方法来实现,取孔径大小为3,
blur = cv2.medianBlur(gray, 3) #模板大小3*3
处理后的图片效果如下:
接着我们需要对图像进行二值化处理,即将图像由灰度模式转化至黑白模式,当然阈值的选择很重要,在这里我们选择二值化的阈值为200,
ret,thresh1 = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)
二值化的图片效果如下:
最后我们需要在二值化处理后的图片中提取单个字符,主要利用OpenCV中的最小外接矩形函数来提取,代码如下:
image, contours, hierarchy = cv2.findContours(thresh1, 2, 2)
flag = 1
for cnt in contours:
# 最小的外接矩形
x, y, w, h = cv2.boundingRect(cnt)
if x != 0 and y != 0 and w*h >= 100:
print((x,y,w,h))
# 显示图片
cv2.imwrite('E://char%s.jpg'%flag, thresh1[y:y+h, x:x+w])
flag += 1
需要注意的是,对提取后的字符图片有一定要求,比如x,y的值不能为0以及图片的大小要超过100,不然我们会得到其他的不想要的图片。提取单个字符后的图片如下:
提取的效果还是不错的。
总结
本文主要通过一个简单的验证码例子,逐步展示了如何利用OpenCV来获取单个字符,这些都是图像处理的基本技巧。怎么样,这个技能你是否get了呢?
欢迎大家交流,也祝大家中秋节快乐~~
最后附上本次操作的Python代码,供大家参考。
import cv2
def split_picture(imagepath):
# 以灰度模式读取图片
gray = cv2.imread(imagepath, 0)
# 将图片的边缘变为白色
height, width = gray.shape
for i in range(width):
gray[0, i] = 255
gray[height-1, i] = 255
for j in range(height):
gray[j, 0] = 255
gray[j, width-1] = 255
# 中值滤波
blur = cv2.medianBlur(gray, 3) #模板大小3*3
#print(blur)
# 二值化
ret,thresh1 = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)
#print(thresh1)
image, contours, hierarchy = cv2.findContours(thresh1, 2, 2)
flag = 1
for cnt in contours:
# 最小的外接矩形
x, y, w, h = cv2.boundingRect(cnt)
if x != 0 and y != 0 and w*h >= 100:
print((x,y,w,h))
# 显示图片
cv2.imwrite('E://char%s.jpg'%flag, thresh1[y:y+h, x:x+w])
flag += 1
def main():
imagepath = 'E://VerifyCode.jpg'
split_picture(imagepath)
main()
注意:本人现已开通微信公众号: 轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~
OpenCV入门之获取验证码的单个字符(字符切割)的更多相关文章
- OpenCV入门之获取验证码的单个字符(二)
在文章 OpenCV入门之获取验证码的单个字符(字符切割)中,介绍了一类验证码的处理方法,该验证码如下: 该验证码的特点是字母之间的间隔较大,很容易就能提取出其中的单个字符.接下来,笔者将会介绍如 ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...
- PHP生成带有干扰线的验证码,干扰点、字符倾斜
PHP生成验证码的类代码,本验证码类支持生成干扰点.干扰线等干扰像素,还可以使字符倾斜.在类中你可以定义验证码宽度.高度.长度.倾斜角度等参数,后附有用法: <?php class class_ ...
- php随机获取验证码
<?php $yzm = ""; for($i=0;$i<5;$i++) { $a = rand(0,9); //0-9随机数 $yzm.= $a; } echo jo ...
- android发送短信验证码并自动获取验证码填充文本框
android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ...
- OpenCV 入门
1.入门攻略[安装用] https://www.cnblogs.com/linshuhe/p/5764394.html 2.VS2017配置opencv教程(超详细!!!) https://blog. ...
- selenium+Python3.5获取验证码
其中PIL为Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. PIL第三方库安装 pip install PI ...
- 获取验证码随机字符串@return string $captcha,随机验证码文字
<?php//验证码工具类class Captcha{//属性private $width;private $height;private $fontsize;private $pixes;pr ...
随机推荐
- wx 参数传值
1: data-id 我们可以给HTML元素添加自定义的data-*属性 example: 假设页面里有下面的元素存在: <div id="myDiv" data-nam ...
- 02 of learning python
01 input输入的是str类型 如果输入的是数字的话,要记得强制转换一下! 02 isdigit() 这个方法是用来检测字符串是否全部由数字组成 str.isdigit() 如果字符串只包含数字则 ...
- 搭建node js的运行环境。
第一步:首先安装一个NVM,就是一个node的版本管理器. nvm的下载地址::https://github.com/coreybutler/nvm-windows/releases,我选择下载的是n ...
- 亲子编程玩Micro:bit-动力小车“麦昆”
少儿编程之风已经吹进各大城市,编程猫.乐博机器人.童程童美等专业培训机构逐渐进入大家的视野,年龄段已经从K12逐渐降低到幼儿园中班.其实,少儿编程的门槛并不高,它不会让孩子一上手就去接触代码,而是会通 ...
- Java基础巩固——排序
快速排序 基本思想: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对两部分继续进行排序,直到整个序列有序. 实例: 1.一趟排序的过程: 2.排序的全 ...
- 基于.NET框架的消息通信组件ZMQ资料汇编-总目录
ZMQ是一个比较轻量级的消息通信组件,引用官方的说法: “ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程 ...
- Python shuffle() 函数
描述 shuffle() 方法将序列的所有元素随机排序. 语法 以下是 shuffle() 方法的语法: import random random.shuffle (lst ) 注意:shuffle( ...
- 机器学习入门12 - 分类 (Classification)
原文链接:https://developers.google.com/machine-learning/crash-course/classification/ 1- 指定阈值 为了将逻辑回归值映射到 ...
- Connect By
connect by 用于存在父子,祖孙,上下级等层级关系的数据表进行层级查询. 语法格式: { CONNECT BY [ NOCYCLE ] condition [AND condition]... ...
- nginx介绍(三) 配置篇
3. nginx配置 nginx配置系统受益于Igor Sysoev(nginx创始人)在Apache(阿帕奇软件基金会)的经历.Igor Sysoev洞察出可扩展的配置系统对于一个web服务器来说是 ...