介绍

  在我们日常上网注册账号以及制作网络爬虫时,经常会遇到奇奇怪怪的验证码,有些容易,有些连人眼都无法辨识。于是,大牛们想到了用深度学习的方法来破解验证码,对于一般的验证码往往能出奇制胜,取得不俗的识别效果。对于利用深度学习方法识别验证码,其预处理就是获取验证码中的单个字符,即字符切割。
  本文将通过一个简单的验证码例子,来展示如何利用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入门之获取验证码的单个字符(字符切割)的更多相关文章

  1. OpenCV入门之获取验证码的单个字符(二)

      在文章 OpenCV入门之获取验证码的单个字符(字符切割)中,介绍了一类验证码的处理方法,该验证码如下: 该验证码的特点是字母之间的间隔较大,很容易就能提取出其中的单个字符.接下来,笔者将会介绍如 ...

  2. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  3. opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

    http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...

  4. PHP生成带有干扰线的验证码,干扰点、字符倾斜

    PHP生成验证码的类代码,本验证码类支持生成干扰点.干扰线等干扰像素,还可以使字符倾斜.在类中你可以定义验证码宽度.高度.长度.倾斜角度等参数,后附有用法: <?php class class_ ...

  5. php随机获取验证码

    <?php $yzm = ""; for($i=0;$i<5;$i++) { $a = rand(0,9); //0-9随机数 $yzm.= $a; } echo jo ...

  6. android发送短信验证码并自动获取验证码填充文本框

    android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ...

  7. OpenCV 入门

    1.入门攻略[安装用] https://www.cnblogs.com/linshuhe/p/5764394.html 2.VS2017配置opencv教程(超详细!!!) https://blog. ...

  8. selenium+Python3.5获取验证码

    其中PIL为Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. PIL第三方库安装 pip install PI ...

  9. 获取验证码随机字符串@return string $captcha,随机验证码文字

    <?php//验证码工具类class Captcha{//属性private $width;private $height;private $fontsize;private $pixes;pr ...

随机推荐

  1. 【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch

    本文来自: https://fabxc.org/tsdb/, 如翻译有误,请纠正. 我是从事监控工作的.特别是Prometheus, 一个包含自定义的时间序列库以及集成Kuberntes的监控系统. ...

  2. JS入门经典第二章总结

    document:在对网页编写脚本时,我们使用document对象代表网页.要引用一个属性,只需在document对象后加一个“.”号,然后再加上要引用的属性名. alert():该函数弹出一个消息框 ...

  3. java面试一、1.4锁机制

    免责声明:     本文内容多来自网络文章,转载为个人收藏,分享知识,如有侵权,请联系博主进行删除. 1.3.锁机制 说说线程安全问题,什么是线程安全,如何保证线程安全 线程安全:当多个线程访问某一个 ...

  4. IO模型的介绍

    Stevens 在文章中的一种IO Model: ****blocking IO    #阻塞 IO   (系统调用不返回结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错才返回) *** ...

  5. eclipse 工作区空格和回车键显示为乱码

    eclipse 工作区空格和回车键显示为乱码 解决方法:Windows => Preferences => General =>Editors =>Text Editor =& ...

  6. 图片处理类 类库--C#

    调用如下: Bitmap bitmap = new Bitmap("C:\\Users\\Thinkpad\\Desktop\\aa.jpg"); Bitmap[] bit = n ...

  7. redis入门知识汇总

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...

  8. 原生Ajax GET+POST请求无刷新实现文本框用户名是否被注册

    实现Ajax需要使用一个核心对象XMLHttpRequest XMLHttpRequest对象可以在不向服务器提交整个页面的情况下,实现局部更新网页.当页面全部加载完毕后,客户端通过该对象向服务器请求 ...

  9. [node.js] fs.renameSync()报错

    初学node.js,跟着node入门,操作了一遍.在最后一步,上传图片并显示时遇到报错 fs.js: throw err; ^ Error: ENOENT: no such file or direc ...

  10. iReport 5.6.0 启动闪退的问题 解决方案

    问题描述 本人使用的Windows版本的 iReport 5.6.0,安装成功后,双击桌面上的iReport-5.6.0图标,出现了闪退,无法正常启动的现象.现象如下: 问题原因 iReport 5. ...