Csharp解决验证码中的干扰点干线

验证码图片中的干扰点和干线是十分常见的,在进行验证码识别的时候这些干扰因素必须有效地去除,否则会对识别结果有极大的不良影响,有什么好的方法来解决它们呢,第一种可以根据周边有效点数去噪,第二种可以使用专有滤波算法,而滤波算法也分为好多种,下面知码网就用C#代码来说明一下这两种解决方案

 

根据周边有效点数去噪

 

        ///

 

        ///  去掉杂点(适合杂点/杂线粗为1)

        ///

 

        /// 背前景灰色界限

        ///

        public void ClearNoise(int dgGrayValue, int MaxNearPoints)

        {

            Color piexl;

            int nearDots = 0;

            int XSpan, YSpan, tmpX, tmpY;

            //逐点判断

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

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

                {

                    piexl = bmpobj.GetPixel(i, j);

                    if (piexl.R < dgGrayValue)

                    {

                        nearDots = 0;

                        //判断周围8个点是否全为空

                        if (i == 0 || i == bmpobj.Width - 1 || j == 0 || j == bmpobj.Height - 1)  //边框全去掉

                        {

                            bmpobj.SetPixel(i, j, Color.FromArgb(255, 255, 255));

                        }

                        else

                        {

                            if (bmpobj.GetPixel(i - 1, j - 1).R < dgGrayValue) nearDots++;

                            if (bmpobj.GetPixel(i, j - 1).R < dgGrayValue) nearDots++;

                            if (bmpobj.GetPixel(i + 1, j - 1).R < dgGrayValue) nearDots++;

                            if (bmpobj.GetPixel(i - 1, j).R < dgGrayValue) nearDots++;

                            if (bmpobj.GetPixel(i + 1, j).R < dgGrayValue) nearDots++;

                            if (bmpobj.GetPixel(i - 1, j + 1).R < dgGrayValue) nearDots++;

                            if (bmpobj.GetPixel(i, j + 1).R < dgGrayValue) nearDots++;

                            if (bmpobj.GetPixel(i + 1, j + 1).R < dgGrayValue) nearDots++;

                        }

 

                        if (nearDots < MaxNearPoints)

                            bmpobj.SetPixel(i, j, Color.FromArgb(255, 255, 255));   //去掉单点 && 粗细小3邻边点

                    }

                    else  //背景

                        bmpobj.SetPixel(i, j, Color.FromArgb(255, 255, 255));

                }

        }

 

 

使用滤波算法去噪

 

///

 

        /// 3×3中值滤波除杂,yuanbao,2007.10

        ///

 

        ///

        public void ClearNoise(int dgGrayValue)

        {

            int x, y;

            byte[] p = new byte[9]; //最小处理窗口3*3

            byte s;

            //byte[] lpTemp=new BYTE[nByteWidth*nHeight];

            int i, j;

 

            //--!!!!!!!!!!!!!!下面开始窗口为3×3中值滤波!!!!!!!!!!!!!!!!

            for (y = 1; y < bmpobj.Height - 1; y++) //--第一行和最后一行无法取窗口

            {

                for (x = 1; x < bmpobj.Width - 1; x++)

                {

                    //取9个点的值

                    p[0] = bmpobj.GetPixel(x - 1, y - 1).R;

                    p[1] = bmpobj.GetPixel(x, y - 1).R;

                    p[2] = bmpobj.GetPixel(x + 1, y - 1).R;

                    p[3] = bmpobj.GetPixel(x - 1, y).R;

                    p[4] = bmpobj.GetPixel(x, y).R;

                    p[5] = bmpobj.GetPixel(x + 1, y).R;

                    p[6] = bmpobj.GetPixel(x - 1, y + 1).R;

                    p[7] = bmpobj.GetPixel(x, y + 1).R;

                    p[8] = bmpobj.GetPixel(x + 1, y + 1).R;

                    //计算中值

                    for (j = 0; j < 5; j++)

                    {

                        for (i = j + 1; i < 9; i++)

                        {

                            if (p[j] > p[i])

                            {

                                s = p[j];

                                p[j] = p[i];

                                p[i] = s;

                            }

                        }

                    }

              //      if (bmpobj.GetPixel(x, y).R < dgGrayValue)

                        bmpobj.SetPixel(x, y, Color.FromArgb(p[4], p[4], p[4]));    //给有效值付中值

                }

            }

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值