验证码去噪 分离背景 分离文字 最大类间方差

对验证码这一块很少了解,但拜读了别人的文章,忍不住转为AS代码试试。原文:http://www.cnblogs.com/yuanbao/archive/2007/11/14/958488.html

一般都是直接转为灰度图,根据128(中值)做黑白二值化。但是这样有些暗一些或者亮一些的图片,就无法正确分离。。

所以有一些动态方式计算阀值。例如最大类间方差。

对比一下以下两个图:第一个用最大类间方差,第二个用128做固定阀值。

最大类间方差:

固定阀值:

public function getThresholdGrayValue(bitmapData:BitmapData):int
{
        var pixelNum:Array = new Array();           //图象直方图,共256个点
        var n:int, n1:int, n2:int;
        var total:int;                              //total为总和,累计值
        var m1:Number, m2:Number, sum:Number, csum:Number, fmax:Number, sb:Number;     //sb为类间方差,fmax存储最大方差值
        var k:int, t:int, q:int;
        var threshValue:int = 1;                      // 阈值
        var step:int = 1;
        //生成直方图
        for (var i:int = 0; i < bitmapData.width; i++)
       {
               for (var j:int = 0; j < bitmapData.height; j++)
              {
                      //返回各个点的颜色,以RGB表示
                      var color:uint = bitmapData.getPixel(i,j);
                      var gray:int = Number(color>>16)*0.3 + Number((color>>8)&0xff)*0.6 + Number(color&0xff)*0.1;
                      if(pixelNum[gray])
                           pixelNum[gray]++;            //相应的直方图加1
                      else
                           pixelNum[gray] = 1;
              }
       }
        //直方图平滑化
        for (k = 0; k <= 255; k++)
       {
              total = 0;
               for (t = -2; t <= 2; t++)              //与附近2个灰度做平滑化,t值应取较小的值
              {
                     q = k + t;
                      if (q < 0)                     //越界处理
                           q = 0;
                      if (q > 255)
                           q = 255;
                     total = total + pixelNum[q];    //total为总和,累计值
              }
              pixelNum[k] = int(Number(total) / 5.0 + 0.5);    //平滑化,左边2个+中间1个+右边2个灰度,共5个,所以总和除以5,后面加0.5是用修正值
       }
        //求阈值
       sum = csum = 0.0;
       n = 0;
        //计算总的图象的点数和质量矩,为后面的计算做准备
        for (k = 0; k <= 255; k++)
       {
              sum += Number(k) * Number(pixelNum[k]);     //x*f(x)质量矩,也就是每个灰度的值乘以其点数(归一化后为概率),sum为其总和
              n += pixelNum[k];                       //n为图象总的点数,归一化后就是累积概率
       }
       
       fmax = -1.0;                          //类间方差sb不可能为负,所以fmax初始值为-1不影响计算的进行
       n1 = 0;
        for (k = 0; k < 256; k++)                  //对每个灰度(从0到255)计算一次分割后的类间方差sb
       {
              n1 += pixelNum[k];                //n1为在当前阈值遍前景图象的点数
               if (n1 == 0) { continue; }            //没有分出前景后景
              n2 = n - n1;                        //n2为背景图象的点数
               if (n2 == 0) { break; }               //n2为0表示全部都是后景图象,与n1=0情况类似,之后的遍历不可能使前景点数增加,所以此时可以退出循环
              csum += Number(k) * pixelNum[k];    //前景的“灰度的值*其点数”的总和
              m1 = csum / n1;                     //m1为前景的平均灰度
              m2 = (sum - csum) / n2;               //m2为背景的平均灰度
              sb = Number(n1) * Number(n2) * (m1 - m2) * (m1 - m2);   //sb为类间方差
               if (sb > fmax)                  //如果算出的类间方差大于前一次算出的类间方差
              {
                     fmax = sb;                    //fmax始终为最大类间方差(otsu)
                     threshValue = k;              //取最大类间方差时对应的灰度的k就是最佳阈值
              }
       }
        return threshValue;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

pytorch入门教程 | 第三章:构造一个小型CNN

学过深度卷积网络的应该都非常熟悉这张demo图(LeNet): ? 此图是LeNet的结构图,把32*32的手写英文字符图片作为输入,训练出一个对于手写字符的分...

38970
来自专栏desperate633

小白也能看懂的BP反向传播算法之Surpass Backpropagation

上篇文章小白也能看懂的BP反向传播算法之Further into Backpropagation中,我们小试牛刀,将反向传播算法运用到了一个两层的神经网络结构中...

20920
来自专栏机器之心

教程 | 基础入门:深度学习矩阵运算的概念和代码实现

选自Medium 机器之心编译 参与:蒋思源 本文从向量的概念与运算扩展到矩阵运算的概念与代码实现,对机器学习或者是深度学习的入门者提供最基础,也是最实用的教...

458130
来自专栏磐创AI技术团队的专栏

TensorFlow系列专题(七):一文综述RNN循环神经网络

前馈神经网络不考虑数据之间的关联性,网络的输出只和当前时刻网络的输入相关。然而在解决很多实际问题的时候我们发现,现实问题中存在着很多序列型的数据,例如文本、语音...

11530
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

基于模糊集理论的一种图像二值化算法的原理、实现效果及代码

  这是篇很古老的论文中的算法,发表与1994年,是清华大学黄良凯(Liang-kai Huang) 所写,因此国外一些论文里和代码里称之为Huang's fu...

322110
来自专栏算法channel

全面总结机器学习项目和面试中几乎绕不开的决策树

决策树是一种常见的机器学习算法,它的思想十分朴素,类似于我们平时利用选择做决策的过程。

12300
来自专栏机器之心

教程 | 重新发现语义分割,一文简述全卷积网络

语义分割是一种学习如何识别图像中对象范围的机器学习技术。语义分割赋予机器学习系统与人类相似的理解图像内容的能力。它促使机器学习算法定位对象的精准边界,无论是街景...

17720
来自专栏机器学习之旅

R开发:常用R语言包介绍

r与python差异比较大的一个地方就是,python的机器学习算法集中程度比较高,比如sklearn,就集成了很多的算法,而R语言更多时候需要一个包一个包去了...

13250
来自专栏小鹏的专栏

为什么很多做人脸的Paper会最后加入一个Local Connected Conv?

Deep face:论文。 a. 人脸检测,使用6个基点 b. 二维剪切,将人脸部分裁剪出来 c. 67个基点,然后Delaunay三角化,在轮廓处添加三角形来...

36850
来自专栏鸿的学习笔记

Rolling and Unrolling RNNs

当输入序列被馈送到这样的网络中时,向后的箭头在稍后的步骤将关于早先输入值的信息反馈回系统。我没有在上篇文章中描述的一件事是如何训练这样的网络。所以在这篇文章中,...

15120

扫码关注云+社区

领取腾讯云代金券