介绍

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

    1. 执行权限 对于一般服务项目,需要使用管理员权限打开Visual Studio.右击项目 -> 属性 -> 安全性,如下图: 勾选红框中部分,项目中会增加文件 app.mainfest ...

  2. 使用jenkins自部署Coding项目

    下载安装jenkins 下载地址:https://jenkins.io/download/ 安装后通过主机的8080端口进行程序设置,插件安装默认的就好 Jenkins项目目录:C:\Program ...

  3. Javascript高级编程学习笔记(32)—— 客户端检测(1)能力检测

    能力检测 浏览器厂商虽然在实现公共接口方面投入了大量的精力 但是每种浏览器仍旧存在许多差异 为了让网页能跨浏览器的运行,对浏览器差异做的兼容处理自然无法避免 其中最常用的也就是我们现在所说的能力检测 ...

  4. 每天学点SpringCloud(六):Hystrix使用

    Hystrix是一个实现断路器模式的库.什么是断路器模式呢?就像我们家庭中的电闸一样,如果有那一处出现意外,那么电闸就会立刻跳闸来防止因为这一处意外而引起更大的事故,直到我们确认处理完那一处意外后才可 ...

  5. SVG之文本

    一.文本标签<text> SVG支持直接对文本进行操作,如果我们需要在SVG中使用文本,那么我们需要使用到<text>标签.直接看一个简单的demo. <!DOCTYPE ...

  6. Python档案袋(字符串与二进制的编码与解码)

    字符串 字符串支持像列表似得用下标进行取值操作,和进行切片 字符串格式化: #内容相当于字符串,也可以用双引号包裹 str=''' 111 2222 33333 ---------东小东------- ...

  7. mongo 更新字段值,若不存在则自动创建

    查询语句 db.getCollection("A表").update( {  "id":{$eq:11} } ,{     $set:{"a" ...

  8. Spring Cloud是怎么运行的?

    导读 在之前的文章中给大家介绍了Spring Boot的基本运行原理(链接),收到了很多读者朋友们关于目前比较流行的微服务框架Spring Cloud的问题反馈.因此,在这篇文章中小码哥打算和大家一起 ...

  9. (转)asyncio --- 异步 I/O

    原文:https://docs.python.org/zh-cn/3/library/asyncio.html asyncio 是用来编写 并发 代码的库,使用 async/await 语法. asy ...

  10. VueJs(11)---vue-router(命名路由,命名视图,重定向别名,路由组件传参)

    vue-router 上篇文章讲了第一篇vue-router相关文章,文章地址:VueJs(10)---vue-router(进阶1) 一.命名路由 有时候,通过一个名称来标识一个路由显得更方便一些, ...