用c#来区别验证码图片的前背景

 做验证码图片识别的时候,一个最重要的步骤就是对前景与背景的分离,分离的方法当然很多了,但是最有效的还是分割法,通过设置一个门槛值来作为区分前背景的基准,这样可以十分方便地得到我们想要的东西。下面就是用C#来实现这一想法的一些代码

 

///

 

        /// 得到灰度图像前景背景的临界值 最大类间方差法,yuanbao,2007.08

        ///

 

        /// 前景背景的临界值

        public int GetDgGrayValue()

        {

            int[] pixelNum = new int[256];           //图象直方图,共256个点

            int n, n1, n2;

            int total;                              //total为总和,累计值

            double m1, m2, sum, csum, fmax, sb;     //sb为类间方差,fmax存储最大方差值

            int k, t, q;

            int threshValue = 1;                      // 阈值

            int step = 1;

            //生成直方图

            for (int i =0; i < bmpobj.Width ; i++)

            {

                for (int j = 0; j < bmpobj.Height; j++)

                {

                    //返回各个点的颜色,以RGB表示

                    pixelNum[bmpobj.GetPixel(i,j).R]++;            //相应的直方图加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)((float)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 += (double)k * (double)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 += (double)k * pixelNum[k];    //前景的“灰度的值*其点数”的总和

                m1 = csum / n1;                     //m1为前景的平均灰度

                m2 = (sum - csum) / n2;               //m2为背景的平均灰度

                sb = (double)n1 * (double)n2 * (m1 - m2) * (m1 - m2);   //sb为类间方差

                if (sb > fmax)                  //如果算出的类间方差大于前一次算出的类间方差

                {

                    fmax = sb;                    //fmax始终为最大类间方差(otsu)

                    threshValue = k;              //取最大类间方差时对应的灰度的k就是最佳阈值

                }

            }

            return threshValue;

        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值