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的内容。

审核编辑 黄昊宇

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

    关注

    66

    文章

    8541

    浏览量

    136233
  • 二值化
    +关注

    关注

    0

    文章

    13

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

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

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

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

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

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

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

    基于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 693次阅读
    基于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 795次阅读
    基于RK3576开发板的<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>算法

    基于RV1126开发板实现二维码识别方案

    在RV1126上实现二维码识别方案
    的头像 发表于 04-11 14:48 577次阅读
    基于RV1126开发板实现<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>方案

    一“”当先!看二维码模组如何重塑智能门锁扫体验

    在科技日新月异的今天,智能门锁正逐步取代传统机械锁,成为现代家庭安全防护的首选。在这场门锁智能革命中,二维码模组以其独特的识别技术和便捷的操作方式,成为智能门锁的重要组成部分。本文将深入探讨
    的头像 发表于 03-12 16:17 773次阅读
    一“<b class='flag-5'>码</b>”当先!看<b class='flag-5'>二维码</b>模组如何重塑智能门锁扫<b class='flag-5'>码</b>体验

    嵌入式二维码识别引擎是什么设备?哪些场景用得到?

    在科技日新月异的今天,嵌入式技术已广泛渗透到我们生活的方方面面,其中,嵌入式二维码识别引擎作为一种高效、便捷的信息采集工具,正逐渐成为众多行业智能升级的重要推手。本文将带您深入探索二维码
    的头像 发表于 03-10 14:57 633次阅读
    嵌入式<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>引擎是什么设备?哪些场景用得到?

    设备能识别哪些类型的 工业二维码扫描设备有什么推荐产品

    在当今智能制造与数字转型的浪潮中,扫设备作为信息识别与采集的关键工具,其重要性日益凸显。从简单的条形码到复杂多变的二维码,再到专为工业环境设计的工业
    的头像 发表于 12-18 15:13 1592次阅读
    扫<b class='flag-5'>码</b>设备能<b class='flag-5'>识别</b>哪些类型的<b class='flag-5'>码</b> 工业<b class='flag-5'>二维码</b>扫描设备有什么推荐产品