码迷,mamicode.com
首页 > 其他好文 > 详细

验证码图片二值化问题 BitmapData 怎么解决

时间:2015-05-13 06:06:48      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白

问题:

为什么我的结果上面还是有很多彩色的小点点呢?原来都是没有的……

谁能帮我看看代码怎么改!谢谢大牛们帮忙!!

技术分享

                Bitmap bit1 = new Bitmap(bit);

                Rectangle rect1 = new Rectangle(0, 0, bit1.Width, bit1.Height);
                BitmapData bitd = bit1.LockBits(rect1, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);  

                IntPtr srcPtr = bitd.Scan0;

                int scanWidth = bitd.Width * 3;
                int src_bytes = scanWidth * bitd.Height;
                byte[] srcRGBValues = new byte[src_bytes];

                Marshal.Copy(srcPtr, srcRGBValues, 0, src_bytes);

                    //灰度化处理  
                    int m = 0, i = 0, j = 0;  //m表示行,j表示列  
                    int k = 0;

                    for (i = 0; i < bit.Height; i++)  //只获取图片的rows行像素值  
                    {
                        for (j = 0; j < bit.Width; j++)
                        {
                            //只处理每行中图像像素数据,舍弃未用空间  
                            //注意位图结构中RGB按BGR的顺序存储  
                            k = 3 * j;
                            var grays = Convert.ToInt16(srcRGBValues[i * scanWidth + k + 2]) +
                                        Convert.ToInt16(srcRGBValues[i * scanWidth + k + 1]) +
                                        Convert.ToInt16(srcRGBValues[i * scanWidth + k + 0]);
                            if (grays >= 382)
                            {
                                srcRGBValues[i * scanWidth + k + 2] = Convert.ToByte(255);
                                srcRGBValues[i * scanWidth + k + 1] = Convert.ToByte(255);
                                srcRGBValues[i * scanWidth + k + 0] = Convert.ToByte(255);
                            }
                            else
                            {
                                srcRGBValues[i * scanWidth + k + 2] = Convert.ToByte(0);
                                srcRGBValues[i * scanWidth + k + 1] = Convert.ToByte(0);
                                srcRGBValues[i * scanWidth + k + 0] = Convert.ToByte(0);

                            }
                        }
                        m++;
                    }
                Marshal.Copy(srcRGBValues, 0, srcPtr, src_bytes);
                bit1.UnlockBits(bitd);
                Image image1 = bit1;

验证码图片二值化问题 BitmapData 怎么解决

标签:

原文地址:http://www.cnblogs.com/herbertchina/p/4499200.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!