c#图像灰度化、灰度反转、二值化

图像灰度化
将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。图像的灰度化处理可用两种方法来实现。
第一种方法使求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。
第二种方法是根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。

/// <summary>

      /// 图像灰度化

      /// </summary>

      /// <param name="bmp"></param>

      /// <returns></returns>

      public static Bitmap ToGray(Bitmap bmp)

      {

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

          {

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

              {

                  //获取该点的像素的RGB的颜色

                  Color color = bmp.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);

                  bmp.SetPixel(i, j, newColor);

              }

          }

          return bmp;

      }

灰度反转
把每个像素点的R、G、B三个分量的值0的设为255,255的设为0。

/// <summary>

      /// 图像灰度反转

      /// </summary>

      /// <param name="bmp"></param>

      /// <returns></returns>

      public static Bitmap GrayReverse(Bitmap bmp)

      {

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

          {

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

              {

                  //获取该点的像素的RGB的颜色

                  Color color = bmp.GetPixel(i, j);

                  Color newColor = Color.FromArgb(255 - color.R, 255 - color.G, 255 - color.B);

                  bmp.SetPixel(i, j, newColor);

              }

          }

          return bmp;

      }

灰度图像二值化
在进行了灰度化处理之后,图像中的每个象素只有一个值,那就是象素的灰度值。它的大小决定了象素的亮暗程度。为了更加便利的开展下面的图像处理操作,还需要对已经得到的灰度图像做一个二值化处理。图像的二值化就是把图像中的象素根据一定的标准分化成两种颜色。在系统中是根据象素的灰度值处理成黑白两种颜色。和灰度化相似的,图像的二值化也有很多成熟的算法。它可以采用自适应阀值法,也可以采用给定阀值法。

  /// <summary>

        /// 图像二值化1:取图片的平均灰度作为阈值,低于该值的全都为0,高于该值的全都为255

        /// </summary>

        /// <param name="bmp"></param>

        /// <returns></returns>

        public static Bitmap ConvertTo1Bpp1(Bitmap bmp)

        {

            int average = 0;

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

            {

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

                {

                    Color color = bmp.GetPixel(i, j);

                    average += color.B;                   

                }

            }

            average = (int)average / (bmp.Width * bmp.Height);

 

            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 > average ? Color.FromArgb(0, 0, 0): Color.FromArgb(255,

 

255, 255);                  

                    bmp.SetPixel(i, j, newColor);

                }

            }

            return bmp;

        }

         

        /// <summary>

        /// 图像二值化2

        /// </summary>

        /// <param name="img"></param>

        /// <returns></returns>

        public static Bitmap ConvertTo1Bpp2(Bitmap img)

        {

            int w = img.Width;

            int h = img.Height;

            Bitmap bmp = new Bitmap(w, h, PixelFormat.Format1bppIndexed);

            BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite,

 

PixelFormat.Format1bppIndexed);

            for (int y = 0; y < h; y++)

            {

                byte[] scan = new byte[(w + 7) / 8];

                for (int x = 0; x < w; x++)

                {

                    Color c = img.GetPixel(x, y);

                    if (c.GetBrightness() >= 0.5) scan[x / 8] |= (byte)(0x80 >> (x % 8));

                }

                Marshal.Copy(scan, 0, (IntPtr)((int)data.Scan0 + data.Stride * y), scan.Length);

            }

            return bmp;

        }

 

时间: 2024-10-08 07:04:01

c#图像灰度化、灰度反转、二值化的相关文章

c#实现图片二值化例子(黑白效果)

C#将图片2值化示例代码,原图及二值化后的图片如下: 原图: 二值化后的图像: 实现代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 7

图片-vc++,二值化,灰度变换

问题描述 vc++,二值化,灰度变换 二值化后的图像再灰度变换为什么一整张图片不一样呢?图片上只有下面三分之一处是正常的灰度变换,上面的是二值化后的灰度变换,怎么样才能使他一致呢? 解决方案 要注意两个方面: 1 图像属性,及非数据区,你的程序不能处理. 2 图像数据在处理后,其数据的个数应该与处理之前相同. 每种图像的处理方法肯定是不同的. 解决方案二: 彩色图像和灰度图像,表示同一个像素用的字节不一样,一个是3 一个是1 解决方案三: 你的图像stride有问题!二值图像是单通道的,你要看下

验证码识别原理浅谈--图像二值化

二值化实现方法有 1.1图像灰度化-中值滤波等,同时可以实现背景的去除 1.2图像灰度化-根据灰度值 1.3根据图像色系范围进行二值化处理 图像二值化的意思就是将图像的有效点给分离出来,然后将图片用0和1两个值进行表 示,因为我们没必要知道他们的具体色值,我们的目的就是要知道他们的具体形状,他们 的特征 譬如说淘宝的验证码,和盛大的验 证码, 他们的有效点无非就是U3FM和YPZ7等字符所占据的空间,我们不用管他们是黑色还是红色 ,我们将所有他们所占据的位置都给置为1,其他位置都给置为0 然后我

hog-HOG算法计算二值化图像的特征

问题描述 HOG算法计算二值化图像的特征 HOG算法能不能计算二值化图像的特征? 若用HOG算法计算二值化图像的特征,是不是就不需要灰度化及Gamma校正? 解决方案 可以的吧,我用opencv的HoG计算特征可以直接输入图像的,什么预处理都不做也是可以的 解决方案二: 可以的吧,我用opencv的HoG计算特征可以直接输入图像的,什么预处理都不做也是可以的

内存分配-利用MFC处理图像二值化一直出错,而且是运行完成后出错

问题描述 利用MFC处理图像二值化一直出错,而且是运行完成后出错 代码如下希望大大们解答!!!好纠结 BOOL CCarDoc::getotsu(unsigned char * lpDIBBits, LONG lWidth, LONG lHeight) { unsigned char * lpNewDIBBits; unsigned char* lpDst; LONG lLineBytes; // 计算图像每行的字节数 lLineBytes = (((lWidth * 8) + 31) / 32

图像处理-(C++编程)已经将图像二值化将ROI区拿出来了,怎么样将其对应到原图当中去呢

问题描述 (C++编程)已经将图像二值化将ROI区拿出来了,怎么样将其对应到原图当中去呢 已经将图像二值化将ROI区与背景分离出来了,怎么样将其对应到原图当中去呢,因为接下来我只想对原图当中的ROI区的原始数据做处理,求思路,有代码更好,拜托拜托 解决方案 http://www.linuxidc.com/Linux/2013-01/78173.htm 解决方案二: http://blog.csdn.net/icvpr/article/details/8515596 解决方案三: 读进表格,从表格

图像处理------基于Otsu阈值二值化

一:基本原理 该方法是图像二值化处理常见方法之一,在Matlab与OpenCV中均有实现. Otsu Threshing方法是一种基于寻找合适阈值实现二值化的方法,其最重 要的部分是寻找图像二值化阈值,然后根据阈值将图像分为前景(白色) 或者背景(黑色).假设有6x6的灰度图像,其像素数据及其对应的直方 图如下图: 阈值寻找方法首先假设是为T=3,则背景像素的比重.均值.方差的计算 结果如下: 根据前景像素直方图,计算比重.均值.方差的过程如下: 上述整个计算步骤与结果是假设阈值T=3时候的结果

SWT 能处理图片锐化,二值化么?

问题描述 大家好.有用SWT处理图像锐化的么? 看了下.SWT图像的imageData 可以转化成awt 的 bufferImage 然后再锐化,转化为swt的imageData.结果发现转化程序不起作用.public static ImageData convertToSWT(BufferedImage bufferedImage) {if (bufferedImage.getColorModel() instanceof DirectColorModel) {DirectColorModel

摄像头-opencv 可以实现实时读取画面并二值化吗?

问题描述 opencv 可以实现实时读取画面并二值化吗? opencv 可以实现实时读取画面并二值化吗? 我可以做到摄像头读取 和处理分开的. 但是合并到一起,还是弄不好