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-14 12:44:07

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

【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化

头文件: typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; typedef long LONG; //BMP文件头(14字节) typedef struct tagBITMAPFILEHEADER { //WORD bfType;//位图文件的类型,必须为BM(在结构体中读取会发生错误,所以在函数中读取) DWORD bfSize;//位图文件的大小,以字节为单位 WORD b

atitit.验证码识别step4--------图形二值化 灰度化

atitit.验证码识别step4--------图形二值化 灰度化 1. 常见二值化的方法原理总结 1 1.1. 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于127的像素值设为255(白色). 1 1.2. 方法二:最常见的二值处理方法是计算像素的平均值K, 2 1.3. 方法三:使用直方图方法来寻找二值化阈值, 2 1.4. 方法四:使用近似一维Means方法寻找二值化阈值,(推荐) 3 2. 使用类库imagei

图像的自适应二值化

机器视觉分为三个阶段 : 图像转化.图像分析.图像理解.若要将一幅图像转化为方便分析理解的格式,有一个很关键的过程就是"图像二值化".一幅图像能否分析理解的准确很大程度上来说取决于二值化效果的好坏.然而目前国际上还没有任何二值化标准的算法,也没相关的确定性数学模型建立.这里我大致介绍我这几天研究的鄙见. 在二值化前有一个很重要的步骤是"图像灰度化",原理就是将原RGB图像的三维矩阵进行f(x) = R*0.3+G*0.51+B*0.11运算得到一个二维矩阵(个人认为

记录一个优秀的图像二值化代码

#region 二值化02 public Bitmap binaryzation(Bitmap srcBitmap, Bitmap dstBitmap) { int threshold = 0; Byte[,] BinaryArray = ToBinaryArray(srcBitmap, out threshold); dstBitmap = BinaryArrayToBinaryBitmap(BinaryArray); return dstBitmap; } /// <summary> //

[转载+原创]Emgu CV on C# (四) —— Emgu CV on 二值化

重点介绍了二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数)  1.概述 图像二值化是图像处理中的一项基本技术,也是很多图像处理技术的预处理过程. 图像的预处理在进行图像二值化操作前要对图像进行预处理,包括彩色图像灰化和增强.由于选取阈值需要参照直方图,因此在图像进行处理后,我们再获取图像的直方图以帮助选取阈值.整个流程如下所示: 读取图像→灰度图像→图像增强→图像直方图→二值化处理 2.数学原理(转载,基本可以不

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

图像 - 灰度化、灰度反转、二值化

原文地址:http://www.cnblogs.com/gdjlc/archive/2013/03/05/2943801.html 图像灰度化: 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围.而灰度图像是R.G.B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图

VB6之图像灰度与二值化

老代码备忘,我对图像处理不是太懂. 注:部分代码引援自网上,话说我到底自己写过什么代码... Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hbitmap As Long, _ ByVal dwCount As Long, _ lpBits As Any) As Long Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hbitm

【OPENCV】图像的预处理(灰度图、二值化、字符矫正(旋转))

1.首先加载原始图片: 2.cvCvtColor(img, source, CV_BGR2GRAY);转化成灰度图像: 3.cvThreshold(source,source_gray,100,255,CV_THRESH_BINARY );进行二值化处理. 由于原始的图片会有一定的角度,需要进行旋转,而旋转的话可以使用OPENCV提供的函数实现,本文中采用的是自己编写的,即通过旋转360,并记录旋转某个角度的时候使得在x轴方向的投影最大化. 如图,经过处理的图片效果如下所示: 完整的工程已经上传