C++,OpenCV-RGB模型(3)
  Jk5625xsZPHl 2023年11月02日 61 0

什么是色彩模型

颜色模型指的是某个三维颜色空间中的一个可见光子集,它包含某个色彩域的所有色彩。一般而言,任何一个色彩域都只是可见光的子集,任何一个颜色模型都无法包含所有的可见光(通俗一点讲就是表示颜色的一种方式)

RGB模型

在计算机体系中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,主要是易于实现RGB三原色的组合表达各种颜色方便屏幕显示。学过物理的我们应该知道,可见光谱是连续的,而三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,因为人眼感光细胞就是由红绿蓝三种感光细胞组成的。只能说“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”

RGB 的局限

  • RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。
  • 自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而 RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。
  • 人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。
  • 所以RGB颜色空间适合于显示系统,却并不适合于图像处理。

RGB分类

RGB16:每个像素用16比特位表示,占2个字节

RGB565:RGB分量分别使用5位、6位、5位

C++,OpenCV-RGB模型(3)_图像处理

RGB555:RGB分量分别使用5位,5位,6位

C++,OpenCV-RGB模型(3)_颜色空间_02

C++实现获取5位上的值:

#include <iostream>
using namespace std;
struct Color 
{
	unsigned int color : 15;
};
void getValueRGB555() 
{
	Color xColor = { 0b110000011100011 };
	//0b11000 00111 00011
	cout <<"xColor:" << xColor.color << endl;
	int R = xColor.color >> 10;
	//0x03E0: 0000 11 1110 0000
	int G = (xColor.color & 0x03E0) >> 5;
	//0000  0001 1111
	int B = xColor.color & 0x001F;
	cout << "R:"<< R << endl;
	cout << "G:" << G << endl;
	cout << "B:" << B << endl;
}
int main() 
{
	getValueRGB555();
	return 0;
}

RGB24格式:每个像素用24比特位表示,占3个字节,在内存中RGB各排列顺序位:BGR

C++,OpenCV-RGB模型(3)_颜色空间_03

RGB32格式:每个像素用32比特位表示,占4个字节,R,G,B分量分别用8个比特位表示,存储顺序位B,G,R,最后8个字节保留

ARGB32:本质就是带alpha通道的RGB24,与RGB32的区别在于,保留的8个比特位用来表示透明,也就是alpha的值。

C++,OpenCV-RGB模型(3)_ios_04

C++实现获取各个8位上的值

#include <iostream>
using namespace std;
void getValueRGB32()
{
	int color = 0x0F0A0B0C;
	cout << "color:" << color << endl;
	int B = color >> 24;					//第一个8位
	int G = (color & 0x00FF0000) >> 16;		//第二个8位
	int R = (color & 0x0000FF00) >> 8;		//第三个8位
	int A = color & 0x000000FF;				//最后一个8位
	cout << "B:" << B << endl;
	cout << "G:" << G << endl;
	cout << "R:" << R << endl;
	cout << "A:" << A << endl;
}
int main() 
{
	getValueRGB32();
	return 0;
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年11月19日   14   0   0 #includeios数据
  gBkHYLY8jvYd   2023年11月22日   23   0   0 ioscii++
  gBkHYLY8jvYd   2023年12月06日   19   0   0 #includeios数据
  gBkHYLY8jvYd   2023年11月22日   26   0   0 #includeiosci
Jk5625xsZPHl