热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

彩色图转灰度图的原理

彩色图转灰度图的原理图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算、识别。彩色图转换灰度图的原理如下:我们知道彩色位图是由RGB三个分量组成,其文件存储格式为

 

彩色图转灰度图的原理

 

 

 

图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算、识别。

彩色图转换灰度图的原理如下:

我们知道彩色位图是由R/G/B三个分量组成,其文件存储格式为

BITMAPFILEHEADER+BITMAPINFOHEADER,紧跟后面的可能是:

如果是24位真彩图,则每个点是由三个字节分别表示R/G/B,所以这里直接跟着图像的色彩信息;

如果是8位(256色),4位(16色),1位(单色)图,则紧跟后面的是调色板数据,一个RGBQUAD类型的数组,其长度由BITMAPINFOHEADER.biClrUsed来决定。

然后后面紧跟的才是图像数据(24位图是真实的图像数据,其他的则是调色板的索引数据)。

灰度图是指只含亮度信息,不含色彩信息的图象,就象我们平时看到的黑白照片:亮度由暗到明,变化是连续的。因此,要表示灰度图,就需要把亮度值进行 量化。通常划分成0到255共256个级别,其中0最暗(全黑),255最亮(全白)。在表示颜色的方法中,除了RGB外,还有一种叫YUV的表示方法, 应用也很多。电视信号中用的就是一种类似于YUV的颜色表示方法。在这种表示方法中,Y分量的物理含义就是亮度,Y分量包含了灰度图的所有信息,只用Y分 量就能完全能够表示出一幅灰度图来。

 什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:

  1.浮点算法:Gray= 0.299R+0.587G+0.114B 

  2.整数方法:Gray=(R*30+G*59+B*11)/100

  3.移位方法:Gray =(R*28+G*151+B*77)>>8;

  4.平均值法:Gray=(R+G+B)/3;

  5.仅取绿色:Gray=G;

通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了

 

从 RGB 到 YUV 空间的 Y 转换公式为: 

Y = 0.299R+0.587G+0.114B 

在 WINDOWS 中,表示 16 位以上的图和以下的图有点不同; 16 位以下的图使用一个调色板来表示选择具体的颜色,调色板的每个单元是 4 个字节,其中一个透明度;而具体的像素值存储的是索引,分别是 1 、 2 、 4 、 8 位。 16 位以上的图直接使用像素表示颜色。 (那16位的图像是怎么表示的呢??)

那么如何将彩色图转换为灰度图呢? 

灰度图中有调色板,首先需要确定调色板的具体颜色取值。我们前面提到了,灰度图的三个分量相等。 

当转换为 8 位的时候,调色板中有 256 个颜色,每个正好从 0 到 255 个,三个分量都相等。 

当转换为 4 位的时候,调色板中 16 个颜色,等间隔平分 255 个颜色值,三个分量都相等。 

当转换为 2 位的时候,调色板中 4 个颜色,等间隔平分 255 个颜色,三个分量相等。 

当转换为 1 位的时候,调色板中两个颜色,是 0 和 255 ,表示黑和白。 

将彩色转换为灰度时候,按照公式计算出对应的值,该值实际上是亮度的级别;亮度从 0 到 255 ;由于不同的位有不同的亮度级别,所以 Y 的具体取值如下: 

       Y = Y/ (1<<(8- 转换的位数 )); (这个不是很懂???)

所以,我们要转化成灰度图,并且存储成一幅可以看到的图像,需要做如下转换:

16位以上的图像不带调色板,只需要把图像数据按每个点的位数都转换成相同的灰度值即可

16位以下的图像,则需要修改调色板的数值,并且按照每个点所占位数修改灰度值索引即可。


推荐阅读
  • 本文将指导你如何通过自定义配置,使 Windows Terminal 中的 PowerShell 7 更加高效且美观。我们将移除默认的广告和提示符,设置快捷键,并添加实用的别名和功能。 ... [详细]
  • Qt应用开发:创建基本窗口
    本文介绍如何使用Qt框架创建基础窗口的两种方法。第一种方法直接在main函数中创建并显示窗口;第二种方法通过定义一个继承自QWidget的类来实现更复杂的功能。 ... [详细]
  • 本文探讨了如何从文本文件中正确读取一行数据,并将其赋值给C语言中的变量,同时解决了常见的错误和注意事项。 ... [详细]
  • 解析 HTTP 头 'Vary: Accept-Encoding' 的作用与重要性
    本文详细探讨了 'Vary: Accept-Encoding' HTTP 头的作用,即指导缓存系统(如代理服务器和 CDN)根据不同的编码需求存储和提供适当的资源版本,确保不同类型的客户端能够接收到适合自己的内容。 ... [详细]
  • 四月个人任务:Linux基础操作与网络管理
    本文介绍了两项主要任务:编写一个脚本来检测192.168.1.0/24子网中当前在线的IP地址,以及如何在Linux系统中挂载Windows网络共享目录。通过具体步骤和代码示例,帮助读者理解和掌握相关技能。 ... [详细]
  • Unity3D入门:实现模型手势操作
    本文主要介绍如何在Unity3D中导入模型并实现基本的手势操作功能,包括模型的旋转、缩放等。通过简单的步骤,帮助初学者快速掌握Unity3D中的模型操作技巧。 ... [详细]
  • Web网络基础
    目录儿1使用HTTP协议访问Web2HTTP的诞生2.1因特网的起源2.2互联网、因特网与万维网2.3万维网与HTTP3网络基础TCPIP3.1TCPIP协议族3.2TCPIP的分 ... [详细]
  • Python中调用Java代码的方法与实践
    本文探讨了如何在Python环境中集成并调用Java代码,通过具体的步骤和示例展示了这一过程的技术细节。适合对跨语言编程感兴趣的开发者阅读。 ... [详细]
  • VS Code 中 .vscode 文件夹配置详解
    本文介绍了 VS Code 中 .vscode 文件夹下的配置文件及其作用,包括常用的预定义变量和三个关键配置文件:launch.json、tasks.json 和 c_cpp_properties.json。 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 去控件化在线文档处理,推动高效信创办公环境
    探讨在线文档处理去控件化的趋势及其对构建高效信创办公生态的影响。 ... [详细]
  • 本文详细介绍了如何在Ubuntu操作系统中安装和配置Maven,包括必要的环境准备和验证步骤。 ... [详细]
  • Mac环境下Java与Ant自动化构建环境搭建指南
    本文详细介绍了如何在Mac操作系统上为测试工程师搭建Java和Ant开发环境,包括环境变量配置等关键步骤。 ... [详细]
  • 本文通过两个具体案例——共同好友查找和线段重叠分析,展示了如何利用Scala编程语言解决实际问题。案例一探讨了如何在社交网络中找出两个用户之间的共同好友;案例二则深入解析了如何计算多条线段之间的重叠情况。 ... [详细]
  • J2EE平台集成了多种服务、API和协议,旨在支持基于Web的多层应用开发。本文将详细介绍J2EE平台中的13项关键技术规范,涵盖从数据库连接到事务处理等多个方面。 ... [详细]
author-avatar
指间流年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有