0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

验证码识别之二值化介绍

电子设计 来源:电子设计 作者:电子设计 2020-12-10 20:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

二值化顾名思义就是将数变成两种值,一般非0即1。而在验证码处理中,如果直接使用灰度图,那么每个像素的值会在0-255,这样肯定会增加计算时间,而二值化后每个像素的值只是0和1。

在前面的简单验证码识别中,我的二值化代码是这样写的:a = (a > 180) * 255,至于这里为什么不乘1而乘255,因为我要显示图片看看效果。如果只是用于算法识别的话,乘1会更好。但是,这里的180也就是二值化的阈值是如何得到的,开始是通过一个一个试然后看效果哪个好就选哪个,因为我们一般只识别某个网站的验证码,这样只要测试几次得到结果后便可用于这个网站其他的验证码。

这样测试有点浪费时间,虽然是一次性的,但是你手动测出的验证码不一定是最合适的。所以我们需要算法去自动计算出验证码的阈值,算法有很多,这里我们使用迭代法和最大类间方差法,通过这两个算法计算出来的阈值基本差不多。

迭代法

  1. 求出图像中的最小灰度值和最大灰度值,分别记为Gmin和Gmax,则阈值初值T0=(Gmin+Gmax)/2;
  2. 根据阈值T0将图像分割成前景和背景两部分,求出两部分的平均灰度值m1和m2,平均灰度值=总灰度值/像素个数
  3. 求出新阈值T1=(m1+m2)/2
  4. 如果T0=T1,则结束,否则将T1的值赋予T0,从第2步重新计算。

算法实现如下:

import numpy as np
from PIL import Image

def iteration(img_path):
    img = Image.open(img_path).convert('L')
    a = np.array(img)
    a = a.ravel()
    k = int((int(a.max()) + int(a.min()))/2) # 即初始阈值T0
    m = -1
    while k != m:
        # C1和C2为前景和背景的像素
        C1 = a[a >= k]   
        C2 = a[a < k]
        k = m
        m1 = np.sum(C1)/len(C1) if len(C1) else 0
        m2 = np.sum(C2)/len(C2) if len(C2) else 0
        m = int((m1 + m2)/2)
    return k 

最大类间方差法(OTSU)

存在阈值T将图像所有像素分为前景和背景,则这两类像素各自的均值就为m1、m2,图像全局均值为mG。同时像素被分为前景和背景的概率分别为p1、p2。因此就有:
p1*m1+p2*m2=mG p1+p2=1 则类间方差表达式为:


使得上式值最大时的阈值T就是最佳的阈值。

算法实现如下:

import numpy as np
from PIL import Image

def otsu(img_path):
    img = Image.open(img_path).convert('L')
    a = np.array(img)
    a = a.ravel()
    L = []
    for k in range(0, 256):
        C1 = a[a >= k]
        C2 = a[a < k]
        if not(len(C1) and  len(C2)):
            L.append(0)
            continue
        m1 = np.sum(C1)/len(C1)
        m2 = np.sum(C2)/len(C2)
        p1 = len(C1)/len(a)
        p2 = len(C2)/len(a)
        x = p1 * p2 * (m1 - m2) * (m1 - m2)
        L.append(x)
    return L.index(max(L))

最后,我正在学习一些机器学习的算法,对于一些我需要记录的内容我都会分享到博客和微信公众号(python成长路),欢迎关注。平时的话一般分享一些爬虫或者Python的内容。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    67

    文章

    8565

    浏览量

    137226
  • 二值化
    +关注

    关注

    0

    文章

    13

    浏览量

    4436
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    远景达LV4300N二维码读头:多场景适配的高效识别利器

    在数字转型加速的当下,二维码识别设备已成为零售、物流、智慧城市等领域的核心交互组件,而远景达LV4300N二维码读头凭借卓越性能,成为市场上备受青睐的
    的头像 发表于 01-20 15:52 295次阅读
    远景达LV4300N<b class='flag-5'>二维码</b>读头:多场景适配的高效<b class='flag-5'>识别</b>利器

    二维码扫描识别器有内嵌款吗?扫识别的功能是嵌入在自助机上的

    在自助设备遍布生活场景的今天,不少人会疑惑“二维码扫描识别器有内嵌款吗?”答案是肯定的——内嵌式二维码扫描识别器早已成为自助机的核心配置,从商场的自动售卖机到火车站的自助取票机,扫
    的头像 发表于 12-04 16:19 651次阅读
    <b class='flag-5'>二维码</b>扫描<b class='flag-5'>识别</b>器有内嵌款吗?扫<b class='flag-5'>码</b><b class='flag-5'>识别</b>的功能是嵌入在自助机上的

    二维码模块是什么?它和普通条码识别设备有什么不同

    在物联网技术飞速发展的今天,条码与二维码已成为信息传递的重要载体,从超市结账到工业生产溯源,从移动支付到医疗耗材管理,相关识别设备无处不在。其中,二维码模块作为核心
    的头像 发表于 11-06 15:54 689次阅读
    <b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>模块是什么?它和普通条码<b class='flag-5'>识别</b>设备有什么不同

    【嘉楠堪智K230开发板试用体验】+二维码识别

    二维码识别 二维码识别本质上是一个通过图像处理技术定位并矫正图像中的二维码区域,然后根据其特定编码规则读取黑白模块的
    发表于 08-22 20:16

    模块厂家怎么选?二维码模组详解

    你是否发现,从超市自助结账的POS机到小区的智能门禁,从快递柜的取件扫到地铁闸机的乘车识别二维码模组早已渗透到生活与产业的每一个角
    的头像 发表于 08-18 15:58 968次阅读
    扫<b class='flag-5'>码</b>模块厂家怎么选?<b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>模组详解

    自动测试如何绕过Cloudflare验证码?Python + Selenium 脚本实战指南!

    01什么是Cloudflare验证码Cloudflare提供网络工具,并提供一套全面的安全功能,以保护网站免受各种在线威胁。Cloudflare验证码是一种用于区分人类用户和自动机器人的功能。它是
    的头像 发表于 08-15 10:01 1628次阅读
    自动<b class='flag-5'>化</b>测试如何绕过Cloudflare<b class='flag-5'>验证码</b>?Python + Selenium 脚本实战指南!

    如何更好选择二维码识别扫描器厂家?

    在采购二维码识别扫描器时,选对厂家直接影响设备的使用效果和后续保障。想要找到靠谱的合作方,以下几个关键因素值得重点考量:▣产品品质是核心二维码识别扫描器的品质直接决定了使用体验,这其中
    的头像 发表于 08-13 16:09 1116次阅读
    如何更好选择<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>扫描器厂家?

    二维码扫描读器在工厂流水线的应用

    在制造业自动升级的浪潮中,二维码扫描读器凭借其信息密度高、抗污损能力强的特性,逐渐成为工厂流水线数据采集的核心设备。它通过精准识别产品表面的二维
    的头像 发表于 08-07 14:48 1037次阅读
    <b class='flag-5'>二维码</b>扫描读<b class='flag-5'>码</b>器在工厂流水线的应用

    一维二维码条码识读器的主要功能有哪些

    在信息快速发展的当下,一维二维码条码识读器已成为各行各业高效处理信息的重要工具。从超市收银到物流追踪,它凭借快速准确的信息识别能力,大幅提升了工作效率。那么,一维二维码条码识读器的主
    的头像 发表于 08-01 15:59 1210次阅读
    一维<b class='flag-5'>二维码</b>条码识读器的主要功能有哪些

    GM861条二维码识别模块用户手册

    GM861条二维码识别模块用户手册
    发表于 07-09 14:56 1次下载

    基于STM32的二维码识别源码+二维码解码库lib

    基于STM32的二维码识别源码+二维码解码库lib,推荐下载!
    发表于 05-28 22:04

    基于LockAI视觉识别模块:C++二维码识别

    : 输出参数,用于存储带有可视结果的输出图像。 results: 输入参数,表示二维码检测的结果集。每个Result对象包含二维码的位置信息和解码后的文本内容。 返回: 无 3
    发表于 05-26 09:57

    基于LockAI视觉识别模块:C++二维码识别

    二维码识别是视觉模块经常使用到的功能之一。我们将演示如何使用基于瑞芯微RV1106的LockAI视觉识别模块进行二维码识别
    的头像 发表于 05-26 09:42 1163次阅读
    基于LockAI视觉<b class='flag-5'>识别</b>模块:C++<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>

    基于STM32的二维码识别源码+二维码解码库lib

    基于STM32的二维码识别源码+二维码解码库lib项目实例下载! 纯分享帖,需要者可点击附件免费获取完整资料~~~【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内
    发表于 05-23 20:45

    基于RK3576开发板的二维码识别算法

    了快速上手指南,包括源码管理、开发环境搭建、例程编译与运行等步骤,并详细介绍二维码识别API的使用方法及调用示例。通过API函数qr_decode,用户可以轻松实现二维码
    的头像 发表于 05-10 09:25 1084次阅读
    基于RK3576开发板的<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>算法