图像处理(验证码识别)程序中常用算法

图像处理(验证码识别)程序中常用算法:灰度,二值化,去噪(1*1像素或者3*3像素等)欢迎拍砖!

看原始图像:

 

图像灰度化
效果图:


代码:

view plaincopy to clipboardprint?
//灰度  
private void btnGray_Click(object sender, EventArgs e)  
{  
    try 
    {  
        int Height = this.picBase.Image.Height;  
        int Width = this.picBase.Image.Width;  
        Bitmap newbitmap = new Bitmap(Width, Height);  
        Bitmap oldbitmap = (Bitmap)this.picBase.Image;  
        Color pixel;  
        for (int x = 0; x < Width; x++)  
        {  
            for (int y = 0; y < Height; y++)  
            {  
                pixel = oldbitmap.GetPixel(x, y);  
 
                newbitmap.SetPixel(x, y, Gray(pixel));  
            }  
        }  
        this.picBase.Image = newbitmap;  
    }  
    catch (Exception err)  
    {  
        MessageBox.Show("灰度化失败 原因:" + err.Message);  
    }  
}  
 
//灰度化算法  
protected static Color Gray(Color c)  
{  
    int rgb = Convert.ToInt32((double)(((0.3 * c.R) + (0.59 * c.G)) + (0.11 * c.B)));  
    return Color.FromArgb(rgb, rgb, rgb);  

        //灰度
        private void btnGray_Click(object sender, EventArgs e)
        {
            try
            {
                int Height = this.picBase.Image.Height;
                int Width = this.picBase.Image.Width;
                Bitmap newbitmap = new Bitmap(Width, Height);
                Bitmap oldbitmap = (Bitmap)this.picBase.Image;
                Color pixel;
                for (int x = 0; x < Width; x++)
                {
                    for (int y = 0; y < Height; y++)
                    {
                        pixel = oldbitmap.GetPixel(x, y);

                        newbitmap.SetPixel(x, y, Gray(pixel));
                    }
                }
                this.picBase.Image = newbitmap;
            }
            catch (Exception err)
            {
                MessageBox.Show("灰度化失败 原因:" + err.Message);
            }
        }

        //灰度化算法
        protected static Color Gray(Color c)
        {
            int rgb = Convert.ToInt32((double)(((0.3 * c.R) + (0.59 * c.G)) + (0.11 * c.B)));
            return Color.FromArgb(rgb, rgb, rgb);
        }

图像二值化
效果图:


代码:

view plaincopy to clipboardprint?
//二值化  
private void btnDobleValue_Click(object sender, EventArgs e)  
{  
    this.picBase.Image = Binarizate((Bitmap)this.picBase.Image);  
}  
 
public static Bitmap Binarizate(Bitmap map)  
{  
    int tv = ComputeThresholdValue(map);  
    int x = map.Width;  
    int y = map.Height;  
    for (int i = 0; i < x; i++)  
    {  
        for (int j = 0; j < y; j++)  
        {  
            if (map.GetPixel(i, j).R >= tv)  
            {  
                map.SetPixel(i, j, Color.FromArgb(0xff, 0xff, 0xff));  
            }  
            else 
            {  
                map.SetPixel(i, j, Color.FromArgb(0, 0, 0));  
            }  
        }  
    }  
    return map;  

        //二值化
        private void btnDobleValue_Click(object sender, EventArgs e)
        {
            this.picBase.Image = Binarizate((Bitmap)this.picBase.Image);
        }

        public static Bitmap Binarizate(Bitmap map)
        {
            int tv = ComputeThresholdValue(map);
            int x = map.Width;
            int y = map.Height;
            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    if (map.GetPixel(i, j).R >= tv)
                    {
                        map.SetPixel(i, j, Color.FromArgb(0xff, 0xff, 0xff));
                    }
                    else
                    {
                        map.SetPixel(i, j, Color.FromArgb(0, 0, 0));
                    }
                }
            }
            return map;
        }
 
图像去噪(1*1像素)
效果图:

 

<原始>

 

<去噪后>
代码:

view plaincopy to clipboardprint?
private void btnClean11_Click(object sender, EventArgs e)  
        {  
            this.picBase.Image = OperateBitmap.ClearNoise((Bitmap)this.picBase.Image,4);  
        }  
 
        //1*1除噪  
        public static Bitmap ClearNoise(Bitmap bitmap, int MaxNearPoints)  
        {  
            Color piexl;  
            int nearDots = 0;  
            //int XSpan, YSpan, tmpX, tmpY;  
            //逐点判断  
            for (int i = 0; i < bitmap.Width; i++)  
                for (int j = 0; j < bitmap.Height; j++)  
                {  
                    piexl = bitmap.GetPixel(i, j);  
                    if (piexl.R != 255)  
                    {  
                        nearDots = 0;  
                        //判断周围8个点是否全为空  
                        if (i == 0 || i == bitmap.Width - 1 || j == 0 || j == bitmap.Height - 1)  //边框全去掉  
                        {  
                            bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));  
                        }  
                        else 
                        {  
                            if (bitmap.GetPixel(i - 1, j - 1).R != 255 ) nearDots++;  
                            if (bitmap.GetPixel(i, j - 1).R != 255) nearDots++;  
                            if (bitmap.GetPixel(i + 1, j - 1).R != 255) nearDots++;  
                            if (bitmap.GetPixel(i - 1, j).R != 255) nearDots++;  
                            if (bitmap.GetPixel(i + 1, j).R != 255) nearDots++;  
                            if (bitmap.GetPixel(i - 1, j + 1).R != 255) nearDots++;  
                            if (bitmap.GetPixel(i, j + 1).R != 255) nearDots++;  
                            if (bitmap.GetPixel(i + 1, j + 1).R != 255) nearDots++;  
                            if (nearDots < 4)  
                            bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));   //去掉单点 && 粗细小3邻边点  
                        }  
 
 
                    }  
                    else  //背景  
                        bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));  
                }  
            return bitmap;  
        } 
private void btnClean11_Click(object sender, EventArgs e)
        {
            this.picBase.Image = OperateBitmap.ClearNoise((Bitmap)this.picBase.Image,4);
        }

        //1*1除噪
        public static Bitmap ClearNoise(Bitmap bitmap, int MaxNearPoints)
        {
            Color piexl;
            int nearDots = 0;
            //int XSpan, YSpan, tmpX, tmpY;
            //逐点判断
            for (int i = 0; i < bitmap.Width; i++)
                for (int j = 0; j < bitmap.Height; j++)
                {
                    piexl = bitmap.GetPixel(i, j);
                    if (piexl.R != 255)
                    {
                        nearDots = 0;
                        //判断周围8个点是否全为空
                        if (i == 0 || i == bitmap.Width - 1 || j == 0 || j == bitmap.Height - 1)  //边框全去掉
                        {
                            bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));
                        }
                        else
                        {
                            if (bitmap.GetPixel(i - 1, j - 1).R != 255 ) nearDots++;
                            if (bitmap.GetPixel(i, j - 1).R != 255) nearDots++;
                            if (bitmap.GetPixel(i + 1, j - 1).R != 255) nearDots++;
                            if (bitmap.GetPixel(i - 1, j).R != 255) nearDots++;
                            if (bitmap.GetPixel(i + 1, j).R != 255) nearDots++;
                            if (bitmap.GetPixel(i - 1, j + 1).R != 255) nearDots++;
                            if (bitmap.GetPixel(i, j + 1).R != 255) nearDots++;
                            if (bitmap.GetPixel(i + 1, j + 1).R != 255) nearDots++;
                            if (nearDots < 4)
                            bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));   //去掉单点 && 粗细小3邻边点
                        }


                    }
                    else  //背景
                        bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));
                }
            return bitmap;
        }
 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gisfarmer/archive/2009/08/12/4438456.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值