c# 图像处理算法(一):灰度、二值化

目录

  • 一、图像处理算法
    • 1、转化为灰度图像
      • 加权平均法(常用)
      • 平均法
      • 最大最小平均法
    • 2、灰度图像反转
    • 3、灰度图像二值化


一、图像处理算法

1、转化为灰度图像

加权平均法(常用)

Image(x,y) = 0.3 * Image_R(x,y) +0.59 * Image_G(x,y)+ 0.11 * Image_B(x,y)
几个加权系数0.3,0.59,0.11是根据人的亮度感知系统调节出来的参数,是个广泛使用的标准化参数。

        /// 
        /// 图像灰度化算法(加权)
        /// 
        /// 输入图像
        /// 输出图像
        public static void ToGray(Bitmap inputBitmap,ref Bitmap outputBitmap)
        {
                for (int i = 0; i < inputBitmap.Width; i++)
                {
                    for (int j = 0; j < inputBitmap.Height; j++)
                    {
                        Color color = inputBitmap.GetPixel(i, j);  //在此获取指定的像素的颜色
                        int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
                        Color newColor = Color.FromArgb(gray, gray, gray);
                    //设置指定像素的颜色  参数:坐标x,坐标y,颜色
                    inputBitmap.SetPixel(i, j, newColor); 
                    }
                }
            outputBitmap = inputBitmap;
        }

平均法

Image(x,y) = 1/3 * Image_R(x,y) +1/3 * Image_G(x,y)+ 1/3 * Image_B(x,y)
将同一个像素位置3个通道RGB的值进行平均。

        /// 
        /// 图像灰度化算法(平均)
        /// 
        /// 输入图像
        /// 输出图像
        public static void ToGray(Bitmap inputBitmap, ref Bitmap outputBitmap)
        {
            for (int i = 0; i < inputBitmap.Width; i++)
            {
                for (int j = 0; j < inputBitmap.Height; j++)
                {
                    Color color = inputBitmap.GetPixel(i, j);  //在此获取指定的像素的颜色
                    int gray = (int)(color.R * (1.0 / 3.0) + color.G * (1.0 / 3.0) + color.B * (1.0 / 3.0));
                    Color newColor = Color.FromArgb(gray, gray, gray);
                    //设置指定像素的颜色  参数:坐标x,坐标y,颜色
                    inputBitmap.SetPixel(i, j, newColor);
                }
            }
            outputBitmap = inputBitmap;
        }

最大最小平均法

Image(x,y) = 0.5( max(Image_R(x,y), Image_G(x,y), Image_B(x,y))+ min(Image_R(x,y), Image_G(x,y), Image_B(x,y)))
取同一个像素位置的RGB中亮度最大的和最小的进行平均。

        /// 
        /// 图像灰度化算法(最大最小平均)
        /// 
        /// 输入图像
        /// 输出图像
        public static void ToGray(Bitmap inputBitmap, ref Bitmap outputBitmap)
        {
            for (int i = 0; i < inputBitmap.Width; i++)
            {
                for (int j = 0; j < inputBitmap.Height; j++)
                {
                    Color color = inputBitmap.GetPixel(i, j);  //在此获取指定的像素的颜色
                    List<int> ts = new List<int>() { color.R,color.B,color.G};
                    ts.Sort(); //排序
                    int gray = (int)(0.5 * (ts[0] + ts[2])); //最大最小的取平均
                    Color newColor = Color.FromArgb(gray, gray, gray);
                    //设置指定像素的颜色  参数:坐标x,坐标y,颜色
                    inputBitmap.SetPixel(i, j, newColor);
                }
            }
            outputBitmap = inputBitmap;
        }

2、灰度图像反转

Image(x,y) = 1/3 (255 - (Image_R(x,y) + Image_G(x,y)+ Image_B(x,y)))

        /// 
        /// 灰度图像反转
        /// 
        /// 输入图像
        /// 输出图像
        public static void GrayReversal(Bitmap inputBitmap, ref Bitmap outputBitmap)
        {
            for (int i = 0; i < inputBitmap.Width; i++)
            {
                for (int j = 0; j < inputBitmap.Height; j++)
                {
                    Color color = inputBitmap.GetPixel(i, j);  //在此获取指定的像素的颜色
                    int gray =(int)((255-color.R + 255-color.G + 255-color.B)/3);
                    Color newColor = Color.FromArgb(gray, gray, gray);
                    //设置指定像素的颜色  参数:坐标x,坐标y,颜色
                    inputBitmap.SetPixel(i, j, newColor);
                }
            }
            outputBitmap = inputBitmap;
        }

c# 图像处理算法(一):灰度、二值化_第1张图片

3、灰度图像二值化

将灰度图像中低于该值的全都到转为为0,高于该值的全都转换为255。

        /// 
        /// 图像二值化:取图片的阈值,低于该值的全都为0,高于该值的全都为255
        /// 
        /// 输入图像
        /// 阈值
        /// 输出图像
        /// 
        public static void ConvertTo1Bpp(Bitmap bmp, int iss, ref Bitmap outputBmp)
        {
            for (int i = 0; i < bmp.Width; i++)
            {
                for (int j = 0; j < bmp.Height; j++)
                {
                    //获取该点的像素的RGB的颜色
                    Color color = bmp.GetPixel(i, j);
                    int value = 255 - color.B;
                    Color newColor = value > iss ? Color.FromArgb(0, 0, 0) : Color.FromArgb(255,
                   255, 255);
                    bmp.SetPixel(i, j, newColor);
                }
            }
            outputBmp = bmp;
        }

c# 图像处理算法(一):灰度、二值化_第2张图片

你可能感兴趣的:(图像处理算法(c#),算法,opencv)