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.mzph.cn/news/676524.shtml

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

相关文章

跳跃表的底层实现

跳跃表的底层是由 C 语言实现的&#xff0c;它的实现源码如下&#xff1a; typedef struct zskiplistNode {// 成员对象robj *obj;double score; // 分值struct zskiplistNode *backward; // 回退指针//层struct zskiplistLevel {// 前进指针struct zskiplistNode *forward;//…

架构之模板方法等模式的使用

目录 一、程序编写背景 二、编程思路讲解 - 类图 - 实现逻辑 - 工厂模式 - 模板方法模式 接口类&#xff08;代码&#xff09;抽象类&#xff08;代码&#xff09;具体实现类&#xff08;代码&#xff09;工厂类&#xff08;代码&#xff09;注册类&#xff08;代码&…

Python爬虫实战:抓取猫眼电影排行榜top100#4

爬虫专栏系列&#xff1a;http://t.csdnimg.cn/Oiun0 抓取猫眼电影排行 本节中&#xff0c;我们利用 requests 库和正则表达式来抓取猫眼电影 TOP100 的相关内容。requests 比 urllib 使用更加方便&#xff0c;而且目前我们还没有系统学习 HTML 解析库&#xff0c;所以这里就…

LiteFlow规则引擎框架

LiteFlow规则引擎框架 Hi&#xff0c;我是阿昌&#xff0c;今天介绍一个规则引擎框架&#xff0c;LiteFlow&#xff1b; 一、前言 那首先得知道什么是规则引擎&#xff1f;规则引擎是 一种用于自动化处理业务规则的软件组件。 在软件行业中&#xff0c;规则引擎通常用于解决…

如何使用Docker本地部署一个开源网址导航页并分享好友公网使用

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

备战蓝桥杯---动态规划(基础3)

本专题主要介绍在求序列的经典问题上dp的应用。 我们上次用前缀和来解决&#xff0c;这次让我们用dp解决把 我们参考不下降子序列的思路&#xff0c;可以令f[i]为以i结尾的最大字段和&#xff0c;易得&#xff1a; f[i]max(a[i],a[i]f[i-1]); 下面是AC代码&#xff1a; #in…

有哪些方法可以配置并发服务器?

通过合理配置并发服务器&#xff0c;可以提高服务器的处理能力和响应速度&#xff0c;从而更好地满足用户需求。本文将介绍一些常见的并发服务器配置方法&#xff0c;以帮助您更好地实现服务器的高效运行。 一、选择合适的操作系统 操作系统的选择是并发服务器配置的重要环节…

【数据结构与算法-初学者指南】【附带力扣原题】队列

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

面向数据报编程-UDP协议

目录 前言&#xff1a; 1.UDP协议API 1.1UDP编程原理 1.2DatagramSocket类 &#xff08;1&#xff09;DatagramSocket构造方法 &#xff08;2&#xff09;DatagramSocket普通方法 1.3DatagramPacket类 &#xff08;1&#xff09;DatagramPacket构造方法 &#xff08;2…

2.6日学习打卡----初学RabbitMQ(一)

2.6日学习打卡 初识RabbitMQ、 一. MQ 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保 存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复 异步通信相当于通…

vs用msys2编译安装 gmp

1 下载 1.1下载MSYS2工具 MSYS2 1.2 下载gmp The GNU MP Bignum Library 2 使用windows的msys2命令窗口,有三个msys2命名窗口 mingw64 3 4 命令 pacman -Syu 重启&#xff1a; pacman -Su 安装&#xff1a; pacman -S mingw-w64-x86_64-gcc pacman -S mingw-w64-x86_64-make…

C语言函数的栈帧与销毁(面试亮点)

目录 如果你能熟练的掌握函数的栈帧与销毁在面试中是及其亮眼的加分项&#xff0c;所以我们来以实例来将解函数是如何实现栈帧与销毁的。 一. 函数栈帧 二.寄存器 三. 用例题讲解创建栈帧的过程 3.1 main 函数的反汇编代码。 第一步&#xff1a;给调用main函数的函数分配…

[职场] 如何通过运营面试_1 #笔记#媒体#经验分享

如何通过运营面试 盈利是公司的事情&#xff0c;而用户就是你运营的事情。你需要彻底建立一个庞大而有效的用户群&#xff0c;这样才能让你们的公司想盈利就盈利&#xff0c;想战略就战略&#xff0c;想融资就融资。 一般从事运营的人有着强大的自信心&#xff0c;后台数据分析…

JVM-虚拟机栈

虚拟机栈 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;采用栈的数据结构来管理方法调用中的基本数据&#xff0c;先进后出&#xff08;First In Last Out&#xff09;,每一个方法的调用使用一个栈帧&#xff08;Stack Frame&#xff09;来保存。 接下来以…

vue3 之 通用组件统一注册全局

components/index.js // 把components中的所组件都进行全局化注册 // 通过插件的方式 import ImageView from ./ImageView/index.vue import Sku from ./XtxSku/index.vue export const componentPlugin {install (app) {// app.component(组件名字&#xff0c;组件配置对象)…

D7 Elasticsearch-Mongodb(搜索记录)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…

mysql笔记:表设计原则

mysql笔记&#xff1a;表设计原则 表对应了一个实体 表与表之间的关系&#xff1a; 一对一 一对多 多对多 一对一关系 例如&#xff1a;用户 user和身份信息 info 子表的外键关联了父表的子健&#xff08;类型必须一样&#xff09; 一对多关系 以电商系统为例子 用户-商…

CSP-202012-1-期末预测之安全指数

CSP-202012-1-期末预测之安全指数 题目很简单&#xff0c;直接上代码 #include <iostream> using namespace std; int main() {int n, sum 0;cin >> n;for (int i 0; i < n; i){int w, score;cin >> w >> score;sum w * score;}if (sum > 0…

使用 Ant Design 的 Upload 组件实现图片

文章目录 使用 Ant Design 的 Upload 组件实现图片Upload组件itemRender自定义上传列表项的渲染方式修改图片名上传图片上传链接中添加 Bearer Token 的请求头onPreview{handlePreview}上传成功后&#xff0c;如何隐藏上传列表 使用 Ant Design 的 Upload 组件实现图片 Upload…

【第二十三课】最小生成树:prime 和 kruskal 算法(acwing858,859 / c++代码 )

目录 前言 Prime算法--加点法 acwing-858 代码如下 一些解释 Kruskal算法--加边法 acwing-859 并查集与克鲁斯卡尔求最小生成树 代码如下 一些解释 前言 之前学最短路的时候&#xff0c;我们都是以有向图为基础的&#xff0c;当时我们提到如果是无向图&#xf…