首页 > 其他分享 >将彩色图转化为灰度图及其原理介绍

将彩色图转化为灰度图及其原理介绍

时间:2024-04-23 15:55:05浏览次数:20  
标签:颜色 彩色 平均法 彩色图像 灰度 图像 原理 original

彩色图介绍

彩色图像是一种包含颜色信息的图像,通常由红色、绿色和蓝色(RGB)三个颜色通道组成。这三种颜色通道可以叠加在一起来形成各种不同的颜色。

彩色图像中的每个像素都有三个数值,分别表示红色、绿色和蓝色通道的强度或亮度。这三个数值通常在0到255之间,其中0代表没有该颜色通道的强度,255代表最高强度。

彩色图像的颜色信息使得它们能够更准确地表达真实世界中的颜色和场景,因此在许多应用中被广泛使用。例如,彩色图像在摄影、电视、电影、计算机游戏、计算机辅助设计(CAD)、医学影像等领域都有重要的应用。

除了RGB颜色模型外,还有其他一些彩色图像的表示方式,如CMYK(青、品红、黄、黑)、HSV(色调、饱和度、亮度)等。这些不同的表示方式适用于不同的应用场景,例如CMYK常用于印刷领域,而HSV常用于图像处理和计算机视觉中。

灰度图介绍

灰度图是一种只包含灰度信息的图像,也称为单通道图像。与彩色图像不同,灰度图像只有一个颜色通道,其中每个像素的灰度值表示了该像素的亮度水平。

在灰度图像中,每个像素的灰度值通常在0到255之间,其中0代表黑色,255代表白色,其间的数值代表了不同程度的灰度或亮度。较小的灰度值通常表示较暗的颜色,而较大的灰度值表示较亮的颜色。

为什么要转化为灰度图?

  1. 简化处理:灰度图像只有一个颜色通道,相比于彩色图像的三个通道(红、绿、蓝),更容易处理和分析。这在一些计算机视觉和图像处理任务中是非常有用的,因为可以减少计算的复杂性。
  2. 降低数据量:灰度图像只需要一个字节来表示一个像素的亮度值,而彩色图像通常需要三个字节。这意味着,在存储和传输图像时,灰度图像所需的数据量更小,可以节省存储空间和传输带宽。
  3. 突出图像结构:有时候,我们更关心图像中的纹理、形状和结构,而不是颜色信息。转换为灰度图像可以突出这些结构,使得一些图像处理任务(如边缘检测、特征提取等)更加有效。
  4. 适应部分场景:在一些应用场景中,彩色信息并不是必需的。例如,人脸识别中,大多数情况下只需要考虑人脸的形状和纹理,而颜色信息对于识别并不是必要的。

转化为灰度图的原理

将彩色图像转换为灰度图像的常见方法之一是通过加权平均法(Weighted Average Method)或者简单平均法(Simple Average Method)。这两种方法都是基于RGB颜色模型的。

  1. 加权平均法

    加权平均法是将彩色图像中的每个像素的RGB值按照一定的权重进行加权平均,然后得到对应的灰度值。通常使用的权重是基于人眼对不同颜色敏感度的调查结果来确定的。由于人眼对于绿色的敏感度最高,对红色次之,对蓝色最低,所以通常的权重设置是:

    • 红色通道权重:0.299
    • 绿色通道权重:0.587
    • 蓝色通道权重:0.114

    然后,对于每个像素,将其RGB值分别乘以对应通道的权重,然后将三个乘积相加,得到灰度值。

    灰度值 = 0.299 * R + 0.587 * G + 0.114 * B

  2. 简单平均法

    简单平均法是将彩色图像中的每个像素的RGB值的平均值作为灰度值。这种方法没有考虑到人眼对不同颜色的敏感度,简单地取了三个通道值的平均值作为灰度值。

    灰度值 = (R + G + B) / 3

使用加权平均法

C#代码示例:

 string imagePath = "测试图片路径";
 Bitmap original = new Bitmap(imagePath);
 Bitmap grayScale = new Bitmap(original.Width, original.Height);
 for (int y = 0; y < original.Height; y++)
 {
     for (int x = 0; x < original.Width; x++)
     {
         System.Drawing.Color originalColor = original.GetPixel(x, y);
         int grayScaleValue = (int)((originalColor.R * 0.299) + (originalColor.G * 0.587) + (originalColor.B * 0.114));
         System.Drawing.Color grayColor = System.Drawing.Color.FromArgb(grayScaleValue, grayScaleValue, grayScaleValue);
         grayScale.SetPixel(x, y, grayColor);
     }
 }
  grayScale.Save("保存图片路径");

原图如下所示:

image-20240423151922149

灰度图如下所示:

image-20240423152112604

简单平均法

C#代码示例:

string imagePath = "测试图片路径";
Bitmap original = new Bitmap(imagePath);
Bitmap grayScale = new Bitmap(original.Width, original.Height);
 for (int y = 0; y < original.Height; y++)
 {
     for (int x = 0; x < original.Width; x++)
     {
         System.Drawing.Color originalColor = original.GetPixel(x, y);
         int grayScaleValue = (int)((originalColor.R + originalColor.G + originalColor.B) / 3);
         System.Drawing.Color grayColor = System.Drawing.Color.FromArgb(grayScaleValue, grayScaleValue, grayScaleValue);
         grayScale.SetPixel(x, y, grayColor);
     }
 }
 grayScale.Save("保存图片路径");

使用OpenCV

知道了什么是灰度图,为什么要转化为灰度图以及转化的原理之后,我们以后直接使用OpenCV提供的函数就好了。

  string imagePath = "测试图片路径";
  using (Mat src = new Mat(imagePath, ImreadModes.Color))
  {
      Cv2.ImShow("原图", src);
      Cv2.WaitKey(0);

      using (Mat gray = new Mat())
      {
          Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);       
          Cv2.ImShow("灰度图", gray);
          Cv2.WaitKey(0);

      }
  }                  

OpenCVSharp中将彩色图转化为灰度图的函数:

 Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);

实现效果:

image-20240423152933363

总结

本文介绍了彩色图与灰度图,为什么要转化为灰度图,及其转化为灰度图的原理,包含加权平均法与简单平均法,在明白了原理之后,直接使用OpenCV中提供的函数进行图像灰度处理,希望对你有所帮助。

标签:颜色,彩色,平均法,彩色图像,灰度,图像,原理,original
From: https://www.cnblogs.com/mingupupu/p/18153025

相关文章

  • 加锁和释放锁的原理
    深入JVM看字节码,创建如下的代码:publicclassSynchronizedDemo2{Objectobject=newObject();publicvoidmethod1(){synchronized(object){}}} 使用javac命令进行编译生成.class文件>javacSynchronizedDemo2.java 使用j......
  • 混淆原理与实践指南
     引言......
  • 数据库原理第一次实验报告
    目录任务一:(数据库CAP)12345任务二:(数据库GlobalToyz)1234567891011121314151617181920写在最后数据库原理第一次实验报告任务一:(数据库CAP)1创建数据库CAP,包含4张表Customers、Products、Agents和Orders。UseMaster;CREATEDatabaseCAP;UseCAP;CREATETABLECUSTOMERS(......
  • springboot启动原理
     启动类上的注解,会扫描路径下的类进容器进行实例化。这样访问时springmvc的dispa就可以访问到这个类了。newDispatcherServlet(webapplication)springmvc需要一个web容器。这个容器参数,在startTomcat(applicationContext)方法里面传入。 ......
  • Spring Boot 启动原理
    SpringBoot启动原理SpringBoot大大简化了我们的开发配置,节省了大量的时间,确实比较方便。但是对于新手来说,如果不了解个中原理,难免会遇到坑。本文作者将带领大家走近神秘的SpringBoot,一步步破开它的神秘面纱,探索SpringBoot的启动原理。开发任何基于SpringBoot的项目......
  • CAN总线原理_学习
    随着通信技术的发展,现今通信方式和协议五花八门,但CAN通信仍然是车载网络最安全可靠且应用最广的技术之一。过去,汽车通常采用常规的点对点通信方式将电子控制单元及电子装置连接起来,但随着电子设备的不断增加,导线数量也随之增多,采用CAN总线网络结构,可以达到信息共享、......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——服务端注册实现原理分析
    远程过程调用RPC——服务端注册实现原理分析rpcserver代码参考我前一篇博文:https://www.cnblogs.com/zuoyang/p/18146870RPCServer端的RPC代码架构主要由两大部分构成:第一部分是服务方法的注册过程。在这个过程中,我们首先通过调用rpc.Register接口将服......
  • 布隆过滤器原理-原论文解析
    布隆过滤器是由BURTONH.BLOOM在1970年提出的一种哈希方法,用于判断一个元素是否存在于某个集合中。HashSet或其他的数据结构都使用了传统的哈希方法,得到的结果是准确的,而布隆过滤器得到的结果不一定准确,因为它使用了一种近似的哈希算法。那为什么还要使用它呢?因为数据量变......
  • 行人属性AI识别/人体结构化属性AI识别算法的原理及应用场景介绍
    行人属性AI识别技术是一种基于人工智能技术的图像识别技术,通过对行人的图像或视频进行处理和分析,提取出其中的结构化信息,如人体姿态、关键点位置、行人属性(性别、年龄、服装等)等。行人结构化数据分析的方法包括姿态估计、关键点检测、行人属性识别等:姿态估计是指根据行人的姿势......
  • 串口通信原理详解232、422、485,入门必看!
    串口通信原理详解232、422、485,入门必看!混说Linux ​关注他 130人赞同了该文章本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。1.串口通讯串口通讯(SerialCommunication),是指外设和计算机间,通过数据信号线、......