OpenCv之图像颜色空间介绍

目录

一、RGB颜色模型

1.1图像RGB模型基本介绍

1.2图像数据类型转换

1.3图像数据类型转换代码举例

二、HSV颜色模型

2.1HSV颜色模型基本概念

2.2HSV颜色模型特点:

三、灰度颜色模型

3.1灰度颜色模型的基本介绍

四、颜色空间之间的转化

4.1转化函数cvtColor ()

4.2一些常用的转换举例

五、代码实战举例和结果


一、RGB颜色模型

1.1图像RGB模型基本介绍

OpenCV 中彩色图像默认是 BGR 顺序,而不是标准 RGB:

  • 第 0 通道:蓝色(B)
  • 第 1 通道:绿色(G)
  • 第 2 通道:红色(R)

因此:

  • 直接用 imshow 显示时,OpenCV 内部会按 BGR 解析,显示正常;
  • 但如果把图像传给其他库(如 Qt、Matplotlib),需要先转成 RGB,否则颜色会反转。

BGR转换为RGB:cvtColor

cpp 复制代码
Mat img_bgr = imread("test.jpg");  // 读取为 BGR
Mat img_rgb;
cvtColor(img_bgr, img_rgb, COLOR_BGR2RGB);  // 转为 RGB

1.2图像数据类型转换

在 OpenCV 中,RGB 图像常见存储方式:

类型 范围 说明
8U(CV_8U 0~255 最常见,每个通道用 8 位无符号整数表示,对应 Vec3b
float 32(CV_32F 0~1 浮点型,常用于中间计算,如归一化后的图像
double 64(CV_64F 0~1 双精度浮点型,精度更高,用于高精度计算

不同图形数据类型之间的转化核心公式

复制代码
void cv::Mat::convertTo(OutputArray m, int rtype, double alpha = 1, double beta = 0) const;
  • 核心公式 :对每个像素值进行线性变换:m(x,y)=α⋅I(x,y)+β
  • 这意味着它不仅能转换数据类型,还能同时对像素值进行缩放和平移

参数详解

参数 含义 示例说明
m 输出图像,转换后的结果存储在这个 Mat 转换完成后,m 的数据类型由 rtype 指定
rtype 转换后的数据类型 ,如 CV_32FCV_64FCV_8U 例如 CV_32F 表示 32 位浮点型单通道图像
alpha 缩放系数,用于调整像素值范围 常见用途:将 0-255CV_8U 图像转为 0-1CV_32F 图像,此时 alpha = 1/255.0
beta 平移系数,用于偏移像素值 alpha=1, beta=0,则只改变数据类型,不改变像素值

1.3图像数据类型转换代码举例

eg1:CV_8U (0--255) → CV_32F (0--1)

这是最常见的转换,用于将图像从整型转为浮点型:

复制代码
Mat img_8u = imread("test.jpg"); // 输入:CV_8UC3,像素值 0--255
Mat img_32f;
img_8u.convertTo(img_32f, CV_32F, 1/255.0, 0); // 输出:CV_32FC3,像素值 0--1

注意:必须用 1/255.0(浮点除法),不能用 1/255(整数除法结果为 0)。

eg2:CV_32F (0--1) → CV_8U (0--255)

将浮点型计算结果转回整型,用于保存或显示:

复制代码
Mat img_32f; // 输入:CV_32FC3,像素值 0--1
Mat img_8u;
img_32f.convertTo(img_8u, CV_8U, 255.0, 0); // 输出:CV_8UC3,像素值 0--255

注意:若 img_32f 中存在超出 [0, 1] 的值,转换后会被自动截断到 0255

eg3:只改变类型,不改变值(alpha=1, beta=0

当你只需要改变数据类型(如从 CV_16U 转为 CV_32F),而不需要缩放像素值时:

复制代码
Mat img_16u; // 输入:CV_16UC1,像素值 0--65535
Mat img_32f;
img_16u.convertTo(img_32f, CV_32F); // alpha=1, beta=0,仅改变类型

eg4:带偏移的缩放(提亮 / 变暗)

通过 beta 调整整体亮度

复制代码
Mat img_8u = imread("dark.jpg");
Mat img_brighter;
img_8u.convertTo(img_brighter, CV_8U, 1.2, 20); // 提亮:1.2倍缩放 + 20偏移

注意:转换后若像素值超过 255,会被截断为 255,可能导致过曝。

二、HSV颜色模型

2.1HSV颜色模型基本概念

HSV 是一种面向视觉感知的颜色模型(区别于 RGB 的硬件导向),将颜色拆解为 3 个独立维度,用 "圆锥 / 棱锥" 结构直观表示,图片中核心要素如下:

分量 英文 含义(图片标注) 取值范围(标准 / OpenCV) 直观理解
H Hue(色度 / 色调) 颜色本身(红、绿、蓝等) 标准:0°~360°;OpenCV:0~179 对应圆锥的 "角度":- 0°/0(红)、120°/60(绿)、240°/120(蓝)- 黄、青、品红等介于基础色之间
S Saturation(饱和度) 颜色的深浅(纯度) 标准:0~1;OpenCV:0~255 对应圆锥的 "半径":- S=0(中心):灰度(无色彩)- S=1/255(边缘):纯色彩(无杂色)
V Value(亮度) 颜色的亮暗 标准:0~1;OpenCV:0~255 对应圆锥的 "高度":- V=0(底部):纯黑- V=1/255(顶部):最亮- 亮度仅影响明暗,不改变颜色本身

2.2HSV颜色模型特点:

  1. 维度独立:H(颜色)、S(纯度)、V(亮度)三个维度互不干扰,比如调整亮度 V 不会改变颜色 H,这是 RGB 模型不具备的(RGB 调整亮度会同时改变三通道值);
  2. 视觉友好: HSV 三分量核心H 定颜色、S 定深浅、V 定亮暗,维度独立,符合人眼感知; ------ 人类一般对 "亮一点的红色""浅一点的蓝色"描述感知较好,对应 HSV 的 V 和 S 调整;
  3. 取值差异:标准 HSV 是 0~360°/0~1/0~1,OpenCV 中适配 8 位图像,H=0~179、S/V=0~255;
  4. 核心优势:相比 RGB,HSV 更适合颜色分割目标识别等场景,抗光照干扰且颜色范围易界定。

三、灰度颜色模型

3.1灰度颜色模型的基本介绍

灰度模型是单通道 颜色表示方式,仅用 "亮度" 一个维度描述图像,是图像处理中最基础且常用的模型。

1. 取值范围与视觉特征

  • 取值范围:0(纯黑)~255(纯白),中间值(如 127)为中灰色;
  • 视觉表现:无色彩信息,仅通过亮度差异区分图像内容,图片中用 "黑→灰→白" 的渐变条直观展示。

2. 工业场景的特殊性

  • 核心应用:部分工业相机(如机器视觉检测相机)直接采集灰度图像 (工业检测关注 "轮廓 / 对比度" 而非色彩,灰度图数据量更小(单通道 vs RGB 三通道),处理效率更高;避免色彩干扰,检测结果更稳定)。

3. RGB 转灰度的核心公式

复制代码
Gray = R*0.3 + G*0.59 + B*0.11
  • 公式逻辑:基于人眼对绿、红、蓝三色的感知灵敏度不同(人眼对绿色最敏感,蓝色最不敏感),给三个通道分配不同权重;
  • 关键限制:仅支持彩色(RGB)转灰度,无法从灰度反向还原出原始 RGB 彩色图像(灰度丢失了色彩信息,是不可逆转换)。

四、颜色空间之间的转化

4.1转化函数cvtColor ()

cpp 复制代码
void cv::cvtColor(
    InputArray src,       // 输入图像(待转换的Mat)
    OutputArray dst,      // 输出图像(转换后的Mat)
    int code,             // 转换码(指定转换方向)
    int dstCn = 0         // 输出图像的通道数,默认0(自动匹配)
);
参数 含义 关键说明
src 输入图像 支持任意深度的 Mat(如 CV_8U、CV_32F),但需符合转换码的要求
dst 输出图像 函数自动分配内存,无需提前初始化
code 转换码 COLOR_原空间2目标空间 组成(如 COLOR_BGR2GRAY),区分大小写
dstCn 输出通道数 默认 0:自动根据转换码确定(如 BGR2GRAY 输出 1 通道);手动指定时需匹配目标空间(如指定 3 则输出 3 通道)
  • 将图像从一种颜色空间 (如 BGR、HSV、GRAY)转换为另一种颜色空间
  • 底层封装了不同颜色空间的数学转换公式(如 RGB 转灰度的加权公式、RGB 转 HSV 的坐标变换公式);
  • 仅改变图像的通道数和像素值含义,不改变图像的尺寸和数据类型(特殊场景除外)。

常用转码code有以下:

4.2一些常用的转换举例

eg1:BGR(彩色)→ GRAY(灰度)

cpp 复制代码
Mat img_bgr = imread("test.jpg"); // 读取BGR彩色图(3通道)
Mat img_gray;
// 转换码:COLOR_BGR2GRAY,输出1通道灰度图
cvtColor(img_bgr, img_gray, COLOR_BGR2GRAY);
  • 底层公式:Gray = B*0.11 + G*0.59 + R*0.3(与你之前看到的 RGB 转灰度公式一致,仅通道顺序调整)不可逆转换(灰度图无法还原为彩色图)。

eg2:BGR ↔ HSV(颜色分割 / 识别)

HSV 是颜色识别的首选空间,比如提取红色、绿色物体:

cpp 复制代码
Mat img_bgr = imread("test.jpg");
Mat img_hsv;
// 1. BGR转HSV
cvtColor(img_bgr, img_hsv, COLOR_BGR2HSV);

// 2. HSV转回BGR
Mat img_bgr_back;
cvtColor(img_hsv, img_bgr_back, COLOR_HSV2BGR);

eg3:BGR ↔ RGB(适配其他库)

当需要将 OpenCV 图像传给 Matplotlib、Qt 等库时,需转 RGB:

复制代码
Mat img_bgr = imread("test.jpg");
Mat img_rgb;
// BGR转RGB
cvtColor(img_bgr, img_rgb, COLOR_BGR2RGB);

eg4:GRAY → BGR(灰度转彩色)

将 1 通道灰度图转为 3 通道 "伪彩色图"(三个通道值相同):

复制代码
Mat img_gray = imread("test.jpg", IMREAD_GRAYSCALE); // 读取灰度图
Mat img_bgr;
cvtColor(img_gray, img_bgr, COLOR_GRAY2BGR); // 输出3通道,每个通道值=灰度值

五、代码实战举例和结果

以下是结合ImageShow工具和图像不同颜色空间之间转化对比代码和结果。

cpp 复制代码
void testImageColorSpace()
{
	Mat image = imread(R"(D:\Study\OpenCvStudy\lean.jpg)", ImreadModes::IMREAD_COLOR);
	Mat img32;
	image.convertTo(img32,CV_32F,1/255.0,0.0);


	Mat HSV, HSV32;
	cvtColor(image, HSV, COLOR_BGR2HSV);
	cvtColor(img32, HSV32, COLOR_BGR2HSV);

	Mat gray1, gray2;
	cvtColor(image, gray1, COLOR_BGR2GRAY);//OpenCv默认GBR顺序
	cvtColor(image,gray2, COLOR_RGB2GRAY);
	waitKey();
}
相关推荐
lauo2 小时前
【智体OS】ibbot智体机灵 V1.0:你的手机AI超脑,一句话开启智体时代————终将打败OpenClaw的国产开源项目
人工智能·智能手机
OPEN-Source2 小时前
给 Agent 安装技能:工具抽象、自动选工具与安全边界
人工智能·python·agent·rag·deepseek
量化炼金 (CodeAlchemy)2 小时前
【交易策略】低通滤波器策略:在小时图上捕捉中期动量
大数据·人工智能·机器学习·区块链
智算菩萨2 小时前
上下文学习的贝叶斯推断视角:隐式梯度下降还是隐式贝叶斯?
人工智能·算法
看-是灰机2 小时前
openclaw
人工智能
骇城迷影2 小时前
从零复现GPT-2 124M
人工智能·pytorch·python·gpt·深度学习
黑巧克力可减脂2 小时前
商鞅变法与代码重构:AI正在如何重写软件工程的“耕战律令”
人工智能·重构·软件工程
大傻^2 小时前
【AI安全攻防战】提示词攻击与防护:从“奶奶漏洞“到企业级防御体系
人工智能·安全·提示词安全
大学在校生,求offer联系2 小时前
YuFeng-XGuard-Reason安全护栏模型实测评价
人工智能·安全