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

news2024/11/18 16:42:48

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.coloradmin.cn/o/1443148.html

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

相关文章

使用AI开发一个红包封面生成器

使用 VUE3&#xff0c;和 Express 开发一个红包封面。 生成效果如下 赠送领取封面&#xff1a;链接 体验地址&#xff1a;https://hongbao.digitalmodel.top/

聊聊JIT优化技术

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 我们知道&#xff0c;想要把高级语言转变成计算…

2024年【上海市安全员C3证】考试试卷及上海市安全员C3证模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【上海市安全员C3证】考试试卷及上海市安全员C3证模拟考试题&#xff0c;包含上海市安全员C3证考试试卷答案和解析及上海市安全员C3证模拟考试题练习。安全生产模拟考试一点通结合国家上海市安全员C3证考试最新…

CS50x 2024 - Lecture 3 - Algorithms

TABLE OF CONTENTS 00:00:00 - Introduction 一种统计班上人数的方法&#xff0c;全部站起来&#xff0c;两两配对&#xff0c;一个坐下&#xff0c;循环 00:01:01 - Overview 00:02:58 - Attendance 00:09:40 - Linear Search 00:24:58 - Binary Search 二分搜索 分而治…

2.9日学习打卡----初学RabbitMQ(四)

2.9日学习打卡 一.RabbitMQ 死信队列 在MQ中&#xff0c;当消息成为死信&#xff08;Dead message&#xff09;后&#xff0c;消息中间件可以将其从当前队列发送到另一个队列中&#xff0c;这个队列就是死信队列。而在RabbitMQ中&#xff0c;由于有交换机的概念&#xff0c;实…

Linux运行级别 | 管理Linux服务

Linux运行级别 级别&#xff1a; 0关机1单用户2多用户但是不运行nfs网路文件系统3默认的运行级别&#xff0c;给一个黑的屏幕&#xff0c;只能敲命令4未使用5默认的运行级别&#xff0c;图形界面6重启切换运行级别&#xff1a; init x管理Linux服务 systemctl命令&#xf…

springboot169基于vue的工厂车间管理系统的设计

基于VUE的工厂车间管理系统设计与实现 摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本…

微信小程序(四十)API的封装与调用

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.在单独的js文件中写js接口 2.以注册为全局wx的方式调用接口 源码&#xff1a; utils/testAPI.js const testAPI{/*** * param {*} title */simpleToast(title提示){//可传参&#xff0c;默认为‘提示’wx.sho…

新春快乐(烟花、春联)【附源码】

新春快乐 一&#xff1a; C语言 -- 烟花二&#xff1a;Python -- 春联三&#xff1a;Python -- 烟花四&#xff1a;HTML -- 烟花 一&#xff1a; C语言 – 烟花 运行效果&#xff1a; #include <graphics.h> #include <math.h> #include <time.h> #include…

BUUCTF LKWA

1.访问页面。 2.选择 Variables variable 关卡 3.获得flag http://357dab81-78b8-4d74-976a-4a69dd894542.node5.buuoj.cn:81/variables/variable.php?funcpassthru&inputcat%2Fflagflag{0020ced6-8166-4fa5-87a7-7d93ee687c3e}

跟着pink老师前端入门教程-day23

苏宁网首页案例制作 设置视口标签以及引入初始化样式 <meta name"viewport" content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0"> <link rel"stylesheet" href"css/normaliz…

Days 26 ElfBoard RGB接口

1. RGB接口介绍 ELF 1支持并行24位LCD,最大RGB888 24位&#xff0c;最高分辨率支持WXGA&#xff08;1366x768&#xff09;&#xff0c;刷新频率为60Hz&#xff0c;底板采用的是RGB565的连接方式&#xff0c;通过一个0.5mm间距54P的FPC座&#xff08;P9&#xff09;引出&#x…

用python写个类

对类的简单概述 面向过程编程,是按照预定的顺序一步步执行,面向对象编程则是将相似的对象归为一类,定义它们的属性和行为,例如人有姓名,性别,年龄等属性,有吃饭,睡觉,学习等行为.这便是类,类是对象的模版,对象是类的实例,例如人是一个抽象的类,而张三是一个具体的对象. 学会用…

Spring Boot3统一结果封装

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 封装目的 常用格式 定义返回结果枚举类 定义返回结果封装类 对返回结果封装 测试封装 前置条件 已…

黄金交易策略(Nerve Knife):反趋势锁定单的处理机制

锁定单是由大趋势反转之后原来的趋势单转变而来的&#xff0c;会在趋势再次反转时变为趋势单或者转入保留单&#xff0c;也有很大概率在趋势识别到转变之前就被减仓减掉了。 完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 一、锁定单怎么样来的&#xf…

旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)

旅游管理系统目录 目录 基于Springboot的旅游管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户管理 2、景点分类管理 3、景点信息管理 4、酒店信息管理 5、景点信息 6、游记分享管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xf…

MySQL-视图(VIEW)

文章目录 1. 什么是视图&#xff1f;2. 视图 VS 数据表3. 视图的优点4. 视图相关语法4.1 创建视图4.2 查看视图4.3 修改视图4.4 删除视图4.5 检查选项 5. 案例6. 注意事项 1. 什么是视图&#xff1f; MySQL 视图&#xff08; View&#xff09;是一种虚拟存在的表&#xff0c;同…

Python实现计数排序

对于如果存在使用两个数组成员进行比较的操作&#xff0c;该方法会导致排序算法的时间复杂度会存在一个下界问题&#xff0c;该问题在使用计数排序的时候可以突破这个理论下界&#xff0c;也即是不适用元素比对的操作的算法之一&#xff0c;计数排序。 添加图片注释&#xff0c…

关于数字图像处理考试

我们学校这门科目是半学期就完结哦&#xff0c;同学们学习的时候要注意时间哦。 选择题不用管&#xff0c;到时候会有各种版本的复习资料的。 以下这些东西可能会是大题的重点&#xff1a; 我根据平时代码总结的&#xff0c;供参考 基本操作&#xff1a; 1.读图&#xff1a;…

【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…