OpenCV 笔记(21):图像色彩空间

1.  图像色彩空间

图像色彩空间是用于定义颜色范围的数学模型。

它规定了图像中可以使用的颜色以及它们之间的关系。它决定了图像中可以显示的颜色范围。不同的色彩空间可以包含不同的颜色范围,因此选择合适的色彩空间对于确保图像在不同设备上看起来一致非常重要。

图像色彩空间的意义主要体现在以下几个方面:

  • 统一颜色标准:色彩空间提供了一种统一的颜色标准,使得不同设备之间能够相互理解和交流颜色信息。

  • 确保颜色一致性:色彩空间可以确保图像在不同设备上显示时颜色一致。

  • 提高图像质量:色彩空间可以提高图像质量。

  • 简化图像处理:色彩空间可以简化图像处理过程,提高图像处理效率。

  • 促进色彩管理:色彩空间是色彩管理的基础。色彩管理是指确保图像在不同设备上显示时颜色一致的过程。通过使用色彩空间,我们可以将图像转换为与目标设备的色彩空间相匹配的色彩空间,从而确保图像在不同设备上显示时颜色一致。

2.  最常见的图像色彩空间

2.1 RGB

RGB 色彩空间是一种基于红、绿、蓝三原色的加色色彩空间。它是用于显示器和电视机的颜色空间,也是用于大多数数字图像的色彩空间。

RGB 色彩空间使用三个分量来表示颜色:红色、绿色和蓝色。每个分量都是一个介于 0 到 255 之间的数字,其中 0 表示该原色不存在,255 表示该原色完全存在。通过混合不同强度的红、绿、蓝光,可以创建各种颜色。例如,混合相等强度的红、绿和蓝光会产生白色光。混合全强度红色和全强度绿色会产生黄色光。

c8d76a3c88732171178be9defd72cadf.jpeg
RGB图1.png
1c3c286be1a35f4d76c1f1c410fa1962.jpeg
RGB图2.png

RGB 色彩空间根据每个分量在计算机中占用的存储字节数的几种常见情况:

  • RGB24: 每个分量占用8位,共24位,是最常见的RGB格式。

  • RGB565: R分量占用5位,G分量占用6位,B分量占用5位,共16位。这种格式可以节省存储空间,但颜色精度较低。

  • RGB555: R分量、G分量和B分量各占用5位,共15位。这种格式与RGB565类似,但颜色精度更低。

  • RGB32: 每个分量占用8位,共32位。增加了透明度通道,可以用于表示透明图像。这种格式可以提供更高的颜色精度,但需要更多的存储空间。

2.2 HSV

HSV 色彩空间是一种使用色相、饱和度和值来表示颜色的色彩空间。它是一种直观的色彩空间,与人眼感知颜色的方式更加接近。

HSV 色彩空间的三个分量:

  • 色相 (Hue):指的是颜色的基本属性,例如红色、黄色、绿色等。色相通常用角度来表示,范围为0-360度。

  • 饱和度 (Saturation):指的是颜色的纯度,也就是颜色中灰色成分的多少。饱和度越高,颜色越纯净;饱和度越低,颜色越灰暗。饱和度通常用百分比来表示,范围为0-100%。

  • (Value):指的是颜色的亮度,也就是颜色的明暗程度。值越高,颜色越明亮;值越低,颜色越暗淡。值通常用百分比来表示,范围为0-100%。

HSV 是一种将 RGB 色彩空间中的点在倒圆锥体中的表示方法。360度的圆作为色相,饱和度的值就是色相切点指向圆心的线,此时的颜色还是不够用于表示。再引入一个亮度,圆锥的垂线,越往上图片越亮,反之越暗。

617f71ccfebe1da0ce477a00d863e2f5.jpeg
HSV图1.png
3093c0a77b1b200e6e292161e7a0b6fb.jpeg
HSV图2.png

HSV 色彩空间主要应用在以下几个方面:

  • 图像分割:可以根据颜色范围来提取图像中的特定对象。

  • 颜色校正:可以调整图像的饱和度或明度来改善图像质量。

  • 特效处理:可以改变图像的颜色或创建特殊效果。

  • 计算机图形: 可以用于创建逼真的物体和场景。

HSV 颜色对应 RGB 分量范围(通过实验计算的模糊范围)

6cce83be496b88fb6b65fc1bb88d446c.jpeg
hsv 对应的 rgb 分量范围.png

2.3 HLS

HLS 色彩空间是一种使用色相、饱和度和明度来表示颜色的色彩空间。

HLS 色彩空间的三个分量:

  • 色相 (Hue): 色相是指颜色的基本属性,通常用角度来表示,范围为0°到360°。0°代表红色,120°代表绿色,240°代表蓝色,360°又回到红色。

  • 饱和度 (Saturation): 饱和度是指颜色的纯度,取值范围为0%到100%。0%表示灰色,100%表示完全饱和。

  • 明度 (Lightness): 明度是指颜色的亮度,取值范围为0%到100%。0%表示黑色,100%表示白色。

29d983d1e342fbcf2f3fc8e7978c63e8.jpeg
HLS.png

下面整理了 HLS 和 HSV 色彩空间的区别:

特性HLSHSV
色相相同相同
饱和度颜色与同亮度、无彩色(灰色)的最大差异程度颜色纯度
亮度感知到的明暗程度颜色的明度
几何形状双圆锥体和圆球体倒圆锥体
适用范围图形设计、用户界面图像处理、计算机图形
f90ca554a13843a3dcc2eb0d4d5b1073.jpeg
HLS和HSV对比.png

2.4 YUV

YUV 色彩空间是一种使用亮度(Y)和两个色度分量(U和V)来表示颜色的颜色空间。它主要用于电视和视频领域。

YUV 色彩空间的三个分量:

  • Y:代表亮度,也就是灰度值。

  • U:代表蓝色和黄色之间的色度分量。

  • V:代表红色和青色之间的色度分量。

72d5f07bc8998a8ca6ab993fe11135c5.jpeg
YUV.png

由上图可知,亮度和颜色无关只是黑白灰的程度不同,因此 UV 信息代表颜色。

YUV 色彩空间的常见格式:

  • YUV420:一种常见的 YUV 格式,每个像素占用 1.5 个字节。其中 Y 分量占用 1 个字节,U 和 V 分量各占用 0.25 个字节。

  • YUV422:另一种常见的 YUV 格式,每个像素占用 2 个字节。其中 Y 分量占用 1 个字节,U 和 V 分量各占用 0.5 个字节。

  • YUV444:每个像素占用 3 个字节,其中 Y、U 和 V 分量各占用 1 个字节。这种格式提供最高的图像质量,但需要最多的存储空间。

YUV 色彩空间常见格式:

格式YUV存储空间图像质量
YUV4448位8位8位24位最高
YUV4228位8位 (每隔一个像素采样)8位 (每隔一个像素采样)16位中等
YUV4208位4位 (每隔两个像素采样)4位 (每隔两个像素采样)12位较低

另外,还有 YCbCr,YCbCr 是从 YUV 色彩空间派生而来,但 YCbCr 采用了更复杂的数学公式,以便更好地利用人眼的视觉特性。

2.5 CMY & CMYK

CMY 色彩空间是一种基于减色原理的颜色空间,使用青色 (Cyan)、品红 (Magenta) 和黄色 (Yellow) 三原色来表示颜色。它通常用于印刷和出版领域,因为CMY油墨可以很好地吸收光线,从而产生各种各样的颜色。

3f42829cde0c1c3845d97aa4073076b2.jpeg
CMY.png

CMY 色彩空间的工作原理:白色光包含所有可见光谱。当白色光穿过 CMY 油墨时,油墨会吸收部分光谱。未被吸收的光线会反射到我们的眼睛中,我们看到的就是 CMY 颜色。

CMYK 是 CMY 的扩展增加了黑色分量。这是因为 CMY 无法完美地再现黑色,因此添加黑色分量可以提高阴影和暗调的准确性。

CMY 和 CMYK 色彩空间的比较:

特性CMYCMYK
颜色分量青色、品红、黄色青色、品红、黄色、黑色
颜色模式减色减色
适用范围印刷印刷
黑色分量
色彩范围较小较大
印刷成本较低较高

2.6 Lab

Lab 色彩空间 是一种基于人眼感知的色彩空间,比其他颜色空间(如 RGB 和 CMYK)更接近于感知颜色。

Lab 色彩空间的三个分量:

  • L:代表亮度,取值范围为 0-100,0 表示黑色,100 表示白色。

  • a:代表从红色到绿色的范围,取值范围为 -128 到 127,-128 表示绿色,127 表示红色。

  • b:代表从蓝色到黄色的范围,取值范围为 -128 到 127,-128 表示蓝色,127 表示黄色。

Lab 色彩空间的特性:

  • 感知均匀性好:Lab 色彩空间与人眼感知颜色方式更接近,因此具有较好的感知均匀性。

  • 颜色范围大:Lab 色彩空间可以表示比 RGB 和 CMYK 更广泛的颜色范围。

  • 与设备无关:Lab 色彩空间与设备无关,因此可以在不同的设备之间准确地转换颜色。

86b4801a2b6543a4b78d0825b7c74b2b.jpeg
Lab.png

3. 图像色彩空间转换

图像色彩空间转换是指将图像从一个色彩空间转换到另一个色彩空间的过程。

OpenCV 提供了 cv::cvtColor() 函数进行图像色彩空间转换,常见的转换方法:

  • RGB 到 HSV:

cv::cvtColor(src, dst, cv::COLOR_RGB2HSV);
  • HSV 到 RGB:

cv::cvtColor(src, dst, cv::COLOR_HSV2RGB);
  • RGB 到 YUV:

cv::cvtColor(src, dst, cv::COLOR_RGB2YUV);
  • YUV 到 RGB:

cv::cvtColor(src, dst, cv::COLOR_YUV2RGB);
  • RGB 到 Lab:

cv::cvtColor(src, dst, cv::COLOR_RGB2Lab);
  • Lab 到 RGB:

cv::cvtColor(src, dst, cv::COLOR_Lab2RGB);

下面的例子,展示了在 OpenCV 中使用 cvtColor()函数将原图转换到各种色彩空间。

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"using namespace std;
using namespace cv;int main(int argc, char **argv) {Mat src = imread(".../flower.jpg");imshow("src", src);Mat gray;cvtColor(src, gray, cv::COLOR_BGR2GRAY);imshow("gray", gray);Mat hsv;cvtColor(src, hsv, cv::COLOR_BGR2HSV); // BGR 转换到 HSV 色彩空间imshow("hsv", hsv);Mat hls;cvtColor(src, hls, cv::COLOR_BGR2HLS); // BGR 转换到 HLS 色彩空间imshow("hls", hls);Mat yuv;cvtColor(src, yuv, cv::COLOR_RGB2YUV); // BGR 转换到 YUV 色彩空间imshow("yuv", yuv);Mat lab;cvtColor(src, lab, cv::COLOR_RGB2Lab); // BGR 转换到 Lab 色彩空间imshow("lab", lab);waitKey(0);return 0;
}
97db447f904675928864fc46343e7c5a.jpeg
原图和灰度图.png
dff4a40abc0ffcf3bd8c022d115a34c7.jpeg
hsv和hls色彩空间.png
8e3fb49ac3d416b4d34244e82001f4d0.jpeg
yuv和lab色彩空间.png

4.  颜色分割

下面的例子,先将图片转换到 HSV 色彩空间,再通过 cv::inRange() 函数将女孩从绿色背景分离出来,最后用蓝色背景替换原先的绿色背景。

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"using namespace std;
using namespace cv;int main(int argc, char **argv) {Mat src = imread(".../girl.jpg");imshow("src", src);Mat hsv;cvtColor(src, hsv, cv::COLOR_BGR2HSV); // BGR 转换到 HSV 色彩空间imshow("hsv", hsv);cv::Scalar lower_green(35, 43, 46);cv::Scalar upper_green(77, 255, 255); // 定义绿色的 HSV 范围Mat mask;inRange(hsv, lower_green, upper_green, mask); // 通过 inRange 函数实现二值化imshow("mask", mask);Mat kernel = getStructuringElement(MORPH_RECT,Size(7,7),Point(-1,-1));morphologyEx(mask, mask, MORPH_OPEN, kernel, Point(-1, -1), 1);imshow("open", mask);GaussianBlur(mask,mask,Size(45,45),0,0);imshow("blur", mask);bitwise_not(mask,mask);imshow("fg", mask);// 重新定义背景颜色Vec3b color;color[0] = 255;color[1] = 0;color[2] = 0;int height = src.rows;int width = src.cols;Mat result(src.size(),src.type());double w = 0.0;int b = 0,g = 0, r = 0;int b1 = 0,g1 = 0, r1 = 0;int b2 = 0,g2 = 0, r2 = 0;for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {int m = mask.at<uchar>(row,col);if(m == 255){ //前景result.at<Vec3b>(row,col) = src.at<Vec3b>(row,col);} else if(m==0){ //背景result.at<Vec3b>(row,col) = color;} else{w = m/ 255;b1 = src.at<Vec3b>(row,col)[0];//前景g1 = src.at<Vec3b>(row,col)[1];r1 = src.at<Vec3b>(row,col)[2];b2 = color[0];//背景g2 = color[1];r2 = color[2];b = b1*w+b2*(1.0-w);g = g1*w+g2*(1.0-w);r = r1*w+r2*(1.0-w);result.at<Vec3b>(row,col)[0] = b;result.at<Vec3b>(row,col)[1] = g;result.at<Vec3b>(row,col)[2] = r;}}}imshow("result",result);waitKey(0);return 0;
}
5ac629103f7c65b8e8944f5fb77fa693.jpeg
原图以及转换到hsv.png
ce9f95fa241257277337ae59a70c83b4.jpeg
生成mask和形态学开操作.png
944178b3b7da78eaab77c69a96aa63a6.jpeg
高斯模糊和bitwise_not操作.png
c2332e93d3a93f012212b93d481e2548.jpeg
替换背景.png

下面简单介绍一下 cv::inRange() 函数:

void inRange(InputArray src, InputArray lowerb,InputArray upperb, OutputArray dst);

第一个参数 src: 输入图像,可以是单通道或多通道图像。

第二个参数 lowerb: 颜色范围的下限,可以是标量或数组。 

第三个参数 upperb: 颜色范围的上限,可以是标量或数组。 

第四个参数 dst: 输出图像,与输入图像大小相同,类型为 CV_8U。

对于图像中的每个像素,cv::inRange() 函数会将其与 lowerb 和 upperb 进行比较。如果像素值在两者之间,则输出图像中的对应像素设置为 255,否则设置为 0。所以,实现了图像的二值化。

5.  总结

图像色彩空间在图像处理和显示中起着重要的作用。

除了本文介绍的图像色彩空间之外,还有许多其他图像色彩空间,每种色彩空间都有自己的优势和劣势。

图像色彩空间可以确保颜色一致性、提高图像质量、简化图像处理并促进色彩管理。随着技术的不断发展,图像色彩空间也在不断发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/461979.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款VMP内存DUMP及IAT修复工具

前言 加壳是恶意软件常用的技巧之一&#xff0c;随着黑客组织技术的不断成熟&#xff0c;越来越多的恶意软件家族都开始使用更高级的加壳方式&#xff0c;以逃避各种安全软件的检测&#xff0c;还有些恶意软件在代码中会使用各种多态变形、加密混淆、反调试、反反分析等技巧&a…

一文读懂:MybatisPlus从入门到进阶

快速入门 简介 在项目开发中&#xff0c;Mybatis已经为我们简化了代码编写。 但是我们仍需要编写很多单表CURD语句&#xff0c;MybatisPlus可以进一步简化Mybatis。 MybatisPlus官方文档&#xff1a;https://www.baomidou.com/&#xff0c;感谢苞米豆和黑马程序员。 Mybat…

springboot集成easypoi导出多sheet页

pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板&#xff1a; 后端代码示例&#xff1a; /*** 导出加油卡进便利店大额审批列…

二叉树的详解

二叉树 【本节目标】 掌握树的基本概念掌握二叉树概念及特性掌握二叉树的基本操作完成二叉树相关的面试题练习 树型结构&#xff08;了解&#xff09; 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。…

Flume安装部署

安装部署 安装包连接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1m0d5O3Q2eH14BpWsGGfbLw?pwd6666 &#xff08;1&#xff09;将apache-flume-1.10.1-bin.tar.gz上传到linux的/opt/software目录下 &#xff08;2&#xff09;解压apache-flume-1.10.1-bin.tar.gz…

Postman接口与压力测试实例

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方&#xff1a; URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper fi…

二维差分---三维差分算法笔记

文章目录 一.二维差分构造差分二维数组二维差分算法状态dp求b[i][j]数组的二维前缀和图解 二.三维前缀和与差分三维前缀和图解:三维差分核心公式图解:模板题 一.二维差分 给定一个原二维数组a[i][j],若要给a[i][j]中以(x1,y1)和(x2,y2)为对角线的子矩阵中每个数都加上一个常数…

python进行批量搜索匹配替换文本文字的matlab操作实例

在进行一些数据处理时&#xff0c;可能需要抓取原文中的一些内容&#xff0c;批量替换原文另外的一些内容&#xff0c;而且事先还需要一步搜索匹配的步骤。 举个例子&#xff0c;如下matlab输出的txt文件&#xff0c;原文件有几万行数据&#xff0c;这里只摘取3行对应的 文件文…

代码随想录算法训练营第四十六天(动态规划篇)|01背包(滚动数组方法)

01背包&#xff08;滚动数组方法&#xff09; 学习资料&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff08;和上次一样&#xff09;&#xff1a;题目页面 (kamacoder.com) 思路 使用一维滚动数组代替二维数组。二维数组的解法记录在&#xff1a;代码随想录算…

nginx + DNS域名解析

配置链接: Nginx 安装配置 | 菜鸟教程 安装完nginx后&#xff0c;访问&#xff1a; cd /usr/local/nginx/sbin/ 然后使用./nginx可使用nginx。 访问:http://服务器的ip地址后出现 因为访问IP地址很繁琐&#xff0c;需要记忆ip的数字地址&#xff0c;因此需要给它一个通俗的…

计算机考研数学】张宇1000题和660哪个更难?

1000题和660题都很难&#xff0c;难的不一样 660题是对于基础深入考察的难 660题是非常经典的客观题练习题&#xff0c;题目难度中等&#xff0c;不难但是每一道题都需要认真的思考才能做出来。如果660题能够吃透&#xff0c;并且每一道题的方法都能够灵活掌握的话&#xff0…

39 MDK 的编译过程及文件类型全解

文章目录 39.1 编译过程39.1.1 编译过程简介 39.2 程序的组成、存储与运行39.3 编译工具链39.3.1 MDK编译文件39.3.2 设置环境变量39.3.3 运行39.3.4 armcc、armasm 及 armlink39.3.4.1 armcc39.3.4.2 查询具体的MDK编译选项的具体信息39.3.4.3 armasm39.3.4.4 armlink39.3.4.5…