Opencv-C++笔记 (8) : opencv-颜色模型与转换

news2025/5/25 7:44:05

文章目录

  • 一、RGB颜色模型
  • 二、YUV颜色模型
  • 三、 HSV(HSB)颜色模型
  • 四、LAB颜色模型
  • 五、GRAY颜色模型
  • 六、CMYK颜色模式
  • 七、GRAY模型
  • 八、不同颜色的转换

一、RGB颜色模型

前面对于RGB颜色模型已经有所介绍,该模型的命名方式是采用三种颜色的英文首字母组成,分别是红色(Red)、绿色(Green)和蓝色(Blue)。虽然该颜色模型的命名方式是红色在前,但是在OpenCV中却是相反的顺序,第一个通道时蓝色(B)分量,第二个通道时绿色(G)分量,第三个通道时红色(R)分量。

根据存储顺序的不同,OpenCV4中提供了这种顺序的反序格式,用于存储第一个通道是红色分量的图像,但是这两种格式的图像的颜色空间是相同的,颜色空间如图3-1所示。三个通道对于颜色描述的范围是相同的,因此RGB颜色模型的空间构成是一个立方体。

在RGB颜色模型中,所有的颜色都是由这三种颜色通过不同比例的混合得到,如果三种颜色分量都为0,则表示为黑色,如果三种颜色的分量相同且都为最大值,则表示为白色。每个通道都表示某一种颜色由0到1的过程,不同位数的图像表示将这个颜色变化过程细分成不同的层级,例如8U3C格式的图像每个通道将这个过程量化成256个等级,分别由0到255表示。在这个模型的基础上增加第四个通道即为RGBA模型,第四个通道表示颜色的透明度,当没有透明度需求的时候,RGBA模型就会退化成RGB模型。

在这里插入图片描述

二、YUV颜色模型

YUV模型是电视信号系统所采用的颜色编码方式。这三个变量分别表示是像素的亮度(Y)以及红色分量与亮度的信号差值(U)和蓝色与亮度的差值(V)。这种颜色模型主要用于视频和图像的传输,该模型的产生与电视机的发展历程密切相关。由于彩色电视机在黑白电视机发明之后才产生,因此用于彩色电视机的视频信号需要能够兼容黑白电视机。彩色电视机需要三个通道的数据才能显示彩色,而黑白电视机只需要一个通道的数据即可,因此为了使视频信号能够兼容彩色电视与黑白电视,将RGB编码方式转变成YUV的编码方式,其Y通道是图像的亮度,黑白电视只需要使用该通道就可以显示黑白视频图像,而彩色相机通过将YUV编码转成RGB编码方式,便可以在彩色电视种显示彩色图像,较好的解决了同一个视频信号兼容不同类型电视的问题。RGB模型与YUV模型之间的转换关系如式所示,其中RGB取值范围均为0-255。
在这里插入图片描述

三、 HSV(HSB)颜色模型

HSV是色度(Hue)、饱和度(Saturation)和亮度(Value)的简写,通过名字也可以看出来该模型通过这三个特性对颜色进行描述。色度是色彩的基本属性,就是平时常说的颜色,例如红色,蓝色等;饱和度是指颜色的纯度,饱和度越高色彩越纯越艳,饱和度越低色彩则逐渐地变灰变暗,饱和度的取值范围是由0到100%;亮度是颜色的明亮程度,其取值范围由0到计算机中允许的最大值。由于色度、饱和度和亮度的取值范围不同,因此其颜色空间模型用锥形表示,其形状如图3-2所示。相比于RGB模型三个颜色分量与最终颜色联系不直观的缺点,HSV模型更加符合人类感知颜色的方式:颜色、深浅以及亮暗。
在这里插入图片描述
RGB=>HSB

V=max(R,G,B)
S=(V-min(R,G,B))*255/V if V!=0, 0 otherwise

   (G - B)*60/S,  if V=R

H= 180+(B - R)*60/S, if V=G
240+(R - G)*60/S, if V=B

若 H<0,则 H=H+360
使用上面从 0° 到 360° 变化的公式计算色调( hue)值,确保它们被 2 除后能试用于8位。

四、LAB颜色模型

Lab颜色模型弥补了RGB模型的不足,是一种设备无关的颜色模型,是一种基于生理特征的颜色模型。在模型中L表示亮度(Luminosity),a和b是两个颜色通道,两者的取值区间都是由-128到+127,其中a通道数值由小到大对应的颜色是从绿色变成红色,b通道数值由小到大对应的颜色是由蓝色变成黄色。其构成的颜色空间是一个球形,形式如图3-3
在这里插入图片描述

五、GRAY颜色模型

GRAY模型并不是一个彩色模型,他是一个灰度图像的模型,其命名使用的是英文单词gray的全字母大写。灰度图像只有单通道,灰度值根据图像位数不同由0到最大依次表示由黑到白,例如8UC1格式中,由黑到白被量化成了256个等级,通过0-255表示,其中255表示白色。彩色图像具有颜色丰富、信息含量大的特性,但是灰度图在图像处理中依然具有一定的优势。例如,灰度图像具有相同尺寸相同压缩格式所占容量小,易于采集,便于传输等优点。常用的RGB模型转成灰度图的方式如式中所示。
在这里插入图片描述

六、CMYK颜色模式

这是彩色印刷使用的一种颜色模式。它由青(Cyan)、洋红(Magenta)、黄(Yellow)和黑(Black)四种颜色组成。其中黑色之所以用K来表示,是为避免和RGB三基色中的蓝色(Blue,用B表示)发生混淆。该种模式的创建基础和RGB不同,它不是靠增加光线,而是靠减去光线,因为和监视器或者电视机不同的是,打印纸不能创建光源,它不会发射光线,只能吸收和反射光线。因此通过对上述四种颜色的组合,便可以产生可见光谱中的绝大部分颜色了。

RGB<=CMYK

R = (255 - C) * ((255 - K) / 255)
G = (255 - M) * ((255 - K) / 255)
B = (255 - Y) * ((255 - K) / 255)

七、GRAY模型

并不是一个彩色模型,而是一个灰度图像的模型,其命名使用的是英文单词gray的全字母大写。灰度图像只有单通道,灰度值根据图像位数不同由0到最大依次表示由黑到白。常用的RGB模型转成灰度图的方式:
在这里插入图片描述

八、不同颜色的转换

针对图像不同颜色模型之间的相互转换,OpenCV 4提供了cvtColor()函数用于实现转换功能,该函数的函数原型如下所示

void cv::cvtColor(InputArray src,
                  OutputArray dst,
                  int code,
                  int dstCn = 0)

src:待转换颜色模型的原始图像。
dst:转换颜色模型后的目标图像。
code:颜色空间转换的标志,如由RGB空间到HSV空间。常用标志及含义在表3-1中给出。
dstCn:目标图像中的通道数,如果参数为0,则从src和代码中自动导出通道数。

函数用于将图像从一个颜色模型转换为另一个颜色模型,前两个参数用于输入待转换图像和转换颜色空间后目标图像,第三个参数用于声明该函数具体的转换模型空间。第四个参数在一般情况下不需要特殊设置,使用默认参数即可。需要注意的是该函数变换前后的图像取值范围,由于8位无符号图像的像素由0到255,16位无符号图像的像素由0-65535,而32位浮点图像的像素是由0到1,因此一定要注意目标图像的像素范围。在线性变换的情况下,范围问题不需要考虑,目标图像的像素不会超出范围。如果在非线性变换的情况下,应将输入RGB图像归一化到适当的范围以内获得正确的结果,例如将8位无符号图像转成32位浮点图像,需要先将图像像素通过除以255缩放到0到1范围内,以防止产生错误结果。
【注意】如果转换过程中添加了alpha通道(RGB模型中第四个通道,表示透明度),则其值将设置为相应通道范围的最大值:CV_8U为255,CV_16U为65535,CV_32F为1
在这里插入图片描述
为了直观的感受同一张图像在不同颜色空间中的样子,在代码清单3-2中给出了前面几种颜色模型互相转换的程序,运行结果如图3-4所示。需要说明的是Lab颜色模型具有负数,而通过imshow()函数显示的图像无法显示负数,因此在结果中给出了Image Watch插件显示图像在Lab模型中的样子。在程序中,我们为了防止转换后出现数值越界的情况,先将CV_8U类型转成CV_32F类型后再进行颜色模型的转换。

#include<iostream>
#include<vector>
#include<string>
#include <opencv2/opencv.hpp>
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

int main(int argc,char** argv) {
    cout<<"OpenCv Version: "<<CV_VERSION<<endl;
    Mat img=imread("/home/wyh/Documents/C++demo/699342568.jpg");
    if(img.empty()){
        cout<<"请确认图像文件名称是否正确"<<endl;
        return -1;
    }
    Mat dst;
    resize(img,dst,Size(img.cols*0.5,img.rows*0.5));
    Mat gray,HSV,YUV,Lab,img32;
    dst.convertTo(img32,CV_32F,1.0/255);//将CV_8U类型转换成CV_32F类型
    cvtColor(img32,HSV,COLOR_BGR2HSV);
    cvtColor(img32,YUV,COLOR_BGR2YUV);
    cvtColor(img32,Lab,COLOR_BGR2Lab);
    cvtColor(img32,gray,COLOR_BGR2GRAY);
    imshow("原图",dst);
    imshow("HSV",HSV);
    imshow("YUV",YUV);
    imshow("Lab",Lab);
    imshow("gray",gray);
    waitKey(10000);
    return 0;
}

在这里插入图片描述

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

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

相关文章

java【抽象类与接口】

抽象类与接口 1 抽象类1.1 定义与使用1.2 抽象类和抽象方法使用原则 2 接口2.1 定义2.2 使用规则 3. JDK中内置接口3.1 Comparable接口3.2 Cloneable接口 抽象类与接口的对比 前言&#xff1a;如果强制要求子类必须覆写一些方法&#xff0c;则就会用到抽象类和抽象方法 1 抽象类…

【备战秋招】每日一题:4月29日美团春招第四题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第四题-SSTF算法 在线评测链接:P1269 题目内容 塔子哥是一名磁盘维修师&#xff0c;他的工作是检查和修复损坏的磁盘。为了提高工作效率&#xff0c;他使用了一种最短服务…

SpringBoot解决跨域的问题

产生跨域问题的原因是浏览器的同源策略&#xff0c;所谓同源是指&#xff1a;域名&#xff0c;协议&#xff0c;端口相同。如果不同&#xff0c;将会出现跨域问题。 一、创建项目 创建两个项目&#xff0c;一个命名为provider提供服务&#xff0c;一个命名为consumer消费服务…

Apifox详细讲解!大大提升了协作效率

目录 一、前言 1.1. 场景一、后端视角&#xff1a; 1.2. 场景二、前端视角&#xff1a; 1.3. 场景三、测试视角&#xff1a; 二、Apifox 2.1 场景一、后端视角&#xff1a; 2.2 场景二、前端视角&#xff1a; 2.3 场景三、测试视角&#xff1a; 三、总结 一、前言 工…

游泳时用什么耳机听歌好?推荐四款音质很不错的游泳耳机

对平常人来说&#xff0c;游泳是个非常好的辅助运动。对身体机能没有太大伤害&#xff0c;还能锻炼到身体大部分的肌肉&#xff0c;对心肺也非常有帮助。随着夏天的到来各大游泳馆甚至是海边都是挤满了人&#xff0c;游泳时候如果还想听歌怎么办&#xff1f;耳机之所以很少听到…

手机远程控制电脑教程,让你随时随地掌控自己的电脑!

为什么我们需要从手机远程控制电脑&#xff1f; 随着远程访问工具的出现&#xff0c;如Windows内置功能远程桌面、Chrome远程桌面等&#xff0c;让我们可以轻松的远程控制另一台电脑&#xff0c;这使得工作和学习更加便捷和高效。 然而&#xff0c;有些人可能会遇…

java 整合opc读取

参考链接 opc 介绍 软件 参考链接 创建opc ua 连接错误 参考连接 前置条件 下载 KEPServer V6 测试 参考连接有地址&#xff0c;这里摘抄下 项目使用KEPServer V6&#xff08;427M&#xff0c;中文&#xff09;&#xff1a;百度网盘 &#xff0c;密码: ykj2软件操作 下载…

聊聊Systemverilog中的function in constraints

有些情况下&#xff0c;constraint不能简单用一行来表达&#xff0c;而是需要复杂的计算&#xff0c;如果都写到constraint block内部就比较复杂&#xff0c;而且很乱&#xff0c;这时候可以调用functions来约束随机变量。在constraint内调用function就称为”function in const…

【剑指offer刷题记录 java版】数组双指针 之 滑动窗口

本系列文章记录labuladong的算法小抄中剑指offer题目 【剑指offer刷题记录 java版】数组双指针 之 滑动窗口 剑指 Offer 48. 最长不含重复字符的子字符串剑指 Offer II 014. 字符串中的变位词剑指 Offer II 015. 字符串中的所有变位词剑指 Offer II 016. 不含重复字符的最长子字…

应用程序监控

什么是应用程序监控 应用程序监控是一项基本功能&#xff0c;可以实时分析关键业务应用程序的前端和后端性能。应用程序监控通过提供有关应用程序可用性、性能和最终用户体验的宝贵见解&#xff0c;在确保应用程序不间断运行方面发挥着至关重要的作用。主动监控应用程序有助于…

Spark SQL数据源的基本操作

文章目录 一、基本操作二、默认数据源&#xff08;一&#xff09;默认数据源Parquet&#xff08;二&#xff09;案例演示读取Parquet文件1、在Spark Shell中演示练习1、将student.txt文件转换成student.parquet练习2、读取student.parquet文件得到学生数据帧&#xff0c;并显示…

MQ消息传递方式

发布订阅模式 发布订阅模式有点类似于我们日常生活中订阅报纸。每年到年尾的时候&#xff0c;邮局就会发一本报纸集合让我们来选择订阅哪一个。在这个表里头列了所有出版发行的报纸&#xff0c;那么对于我们每一个订阅者来说&#xff0c;我们可以选择一份或者多份报纸。比如北…

ESP32(MicroPython) 矩阵键盘电子琴+RGB灯

本程序相比上一个矩阵键盘电子琴程序增加了一个矩阵键盘&#xff0c;并把三个矩阵键盘的同一行相连&#xff0c;扫描周期缩短到40ms。增加RGB灯带&#xff0c;每个周期刷新一个灯&#xff08;随机颜色&#xff09;。 代码如下 #导入Pin模块 from machine import Pin import t…

Django rest framework基本知识

使用pycharm生成Django项目后&#xff0c;会生成工程目录和app目录 工程目录下5个文件&#xff0c;settings.py是全局配置相关的 urls.py是路有相关的 app相关的目录 models.py 数据库ORM对应的模型类 serializers.py 序列化与反序列化处理 views.py 根据request进行…

线性神经网络

线性神经网络 我们应该从线性神经网络开始&#xff0c;去逐步了解深度神经网络&#xff08;深度学习&#xff09;的各种复杂结构和底层原理。 1. 线性回归 用一个线性的模型来拟合数据与它们的标签之间的映射&#xff0c;用于回归问题。 1.1 构造线性模型&#xff1a; y ω…

Fiddler Orchestra用户指南:打造高效协同调试利器

引言&#xff1a;今天Fiddler更新到5.0版本后&#xff0c;小酋不经意间晃到了“Fiddler Orchestra”选项卡。爱折腾的小酋赶紧链接到官方用户指南一睹为快&#xff0c;看看这是什么东西&#xff0c;实现了什么新功能。下面是小酋看后做的一个翻译抢先版。 这是了解和设置Fiddl…

i5 3470+XSB75M-PK+HD 7750安装黑苹果macOS Big Sur 11.7.7

我本次使用的是 HD 7750 进行安装黑苹果&#xff08;闲鱼80元买的&#xff09;&#xff0c;这款显卡直接就是免驱&#xff0c;最高可以安装的版本是 macOS Monterey &#xff0c;但是建议安装至 macOS Big Sur 以获得较好的体验。 EFI&#xff08;OC引导&#xff09; EFI.zip …

RabbitMQ高阶使用队列实现

目录 1 从打车开始说起1.1 需要解决的问题1.1.1 打车排队 2 排队人数2.1 需求2.1.1 需求分析 2.2 实现方案2.2.1 MySQL2.2.1.1 入队2.2.1.2 获取进度2.2.1.3 遇到问题 2.2.3 Redis Zset 2.3 排队人数架构介绍2.4 数据结构2.4.2 zset结构2.4.1 雪花算法 2.5 功能实现2.5.1 派单2…

Java 实现反转一个链表

文章目录 思路核心四步骤循环移动代码实现 思路 翻转指的是改变链表中结点的指向&#xff0c;而不是将它的数据反转。 上图展示出的就是一个反转前的链表&#xff0c;下图展示一个反转后的链表。 根据上图可以看出&#xff0c;结点的地址和数据都没有改变&#xff0c;改变的…

Java SSM框架基础面试题

一、Spring面试题 1、Spring 在ssm中起什么作用&#xff1f; Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a; 1、IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service层&#xff0c;s…