小言_互联网的博客

OpenCV开发笔记(六):OpenCV基础数据结构、颜色转换函数和颜色空间

777人阅读  评论(0)

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/100976153

目录

前言

基础数据结构

基础图像矩阵容器:cv::Mat

点:cv::Point

颜色:cv::Scalar

大小:cv::Size

矩形:cv::Rect

常用颜色空间转换函数:cvtColor()

函数原型

颜色空间转换标识符

常用的颜色空间

RGB颜色空间

RGB555

RGB565

RGB24

RGB32

YUV颜色空间

HSV颜色空间

CIE-RGB颜色空间

CIE-XYZ颜色空间

Lab颜色空间

参考


 

OpenCV开发专栏

OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境

OpenCV开发笔记(一):OpenCV介绍、编译

OpenCV开发笔记(二):cvui交互界面

OpenCV开发笔记(三):OpenCV图像的概念和基本操作

OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储

OpenCV开发笔记(五):OpenCV读取与操作摄像头

OpenCV开发笔记(六):OpenCV基础数据结构、颜色转换函数和颜色空间

OpenCV开发笔记(七):OpenCV基础图形绘制

OpenCV开发笔记(八):OpenCV常用操作之计时、缩放、旋转、镜像

持续补充中…

 

    OpenCV开发笔记(六):OpenCV基础数据结构、颜色转换函数和颜色空间

 

前言

       对图像的处理,就是对数据结构的处理,OpenCV中常用的数据结构cv::Mat、cv::Point、cv::Scalar、cv::Size、cv::Rect,最基础常用的颜色颜色空间转换函数cvtColor()。

 

基础数据结构

基础图像矩阵容器:cv::Mat

       OpenCV中使用cv::Mat来存储,每一个位置存储一个变量,代表该像素点的颜色值,颜色值有多种类型。

       cv::Mat介绍和初始化,具体可查看:OpenCV开发笔记(三):图像的概念和基本操作

       矩阵的基础数据类型可以是char(-127~127)、uchar(0~255),float(4字节,32位)、double(8字节、64位)等等,能存储更加精细的颜色分辨能力,与此同时,将会占用更大的内存空间。

点:cv::Point

       类似于其他预研框架的点。

Point pint;
point.x = 20;
point.y = 40;

       或者

Point point = Point(20, 40);

       点的坐标基础类型还有浮点型以及他基础类型。

颜色:cv::Scalar

       Scalar表示具有4个元素的数组,初始化时注意颜色顺序为BGRA,而非我们一般默认的RGBA。

// 黑色
Scalar();
// 蓝色
Scalar(255);
// 绿色
Scalar(0, 255);
// 红色
Scalar(0, 0, 255);

       注意:只在颜色处和图像初始化时使用A通道,显示无效,后续会再补充A通道的使用。

大小:cv::Size

Size size(5, 5);

size.width和size.height都为5

矩形:cv::Rect

       Rect类的成员变量x、y、width和height,该类有几个基础函数:

  • Size():返回Size类型
  • area():返回矩形的面积
  • contains(Point):判断点是否在矩形内
  • inside(Rect):判断矩形是否在该矩形内
  • tl():返回左上角点的坐标
  • br():返回右下角点的坐标

       求矩阵的交集和并集,可以直接使用如下:

Rect rect = rect1 & rect2;
Rect rect = rect1 | rect2;

       让矩形平移,可以直接使用加减Point:

Rect rectShift = rect + point;

       让矩形缩放,可以直接使用加减Size;

Rect rectShift = rect + size;

 

常用颜色空间转换函数:cvtColor()

函数原型

       cvtColor函数是OpenCV里的颜色空间转换函数,可以实现RGB颜色想HSV、HIS等颜色空间的转换,也可以转换为灰度图像。

void ctvColor(InputArray src, OutputArray dst, int code, int dstCn=0)
  • 参数1:输入图像,可使用cv::Mat类型。
  • 参数2:输出图像,可使用cv::Mat类型。
  • 参数3:颜色控件转换标识符,标识了从原颜色控件转向目标颜色空间(请参考颜色标识符详细解说)。
  • 参数4:颜色通道数,默认为0,输出的图像与输入的图像通道数一致。

颜色空间转换标识符

序号

转换类型

标识符列举

1

RGB ßà BGR

COLOR_BGR2BGRA

COLOR_BGRA2BGRA

COLOR_RGB2BGRA

COLOR_RGBA2BGR

2

RGB ßà 5X5

COLOR_BGR4542RGBA

COLOR_BGR2RGB555

3

RGB ßà Gray

COLOR_RGB2GRAY

COLOR_GRAY2RGB

COLOR_RGBA2GRAY

COLOR_GRAY2RGBA

4

YUV420 ßà RGB

COLOR_YUV420sp2BGR

COLOR_YUV420sp2RGB

COLOR_YUV420i2BGR

COLOR_YUV420i2RGB

5

RGB ßà GIE XYZ

COLOR_BGR2XYZ

COLOR_RGB2XYZ

COLOR_XYZ2BGR

COLOR_XYZ2RGB

6

RGB ßà YCrCb(YUV) JPEG

COLOR_RGB2YCrCb

COLOR_RGB2YCrCb

COLOR_ YCrCb2BGRCOLOR_ YCrCb2RGB

COLOR_RGB2YUV(可将YCrCbYUV替代)

7

RGB ßà HSV

COLOR_BGR2HSV

COLOR_RGB2HSV

COLOR_HSV2BGR

COLOR_HSV2RGB

8

RGB ßà HLS

COLOR_BGR2HLS

COLOR_RGB2HLS

COLOR_HLS2BGR

COLOR_HLS2RGB

9

RGB ßà CIE L*a*b*

COLOR_BGR2Lab

COLOR_RGB2Lab

COLOR_Lab2BGR

COLOR_Lab2RGB

10

RGB ßà CIE L*u*v

COLOR_BGR2Luv

COLOR_RGB2Luv

COLOR_Luv2BGR

COLOR_Luv2RGB

11

RGB ßà Bayer

COLOR_BayerBG2BGR

COLOR_BayerGB2BGR

COLOR_BayerRG2BGR

COLOR_BayerGR2BGR

COLOR_BayerBG2RGB

COLOR_BayerGB2RGB

COLOR_BayerRG2RGB

COLOR_BayerGR2RGB

 

常用的颜色空间

RGB颜色空间

       计算机色彩显示器和彩色电视机显示色彩的原理一样,都是采用R、G、B相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。这种色彩的表示方法称为RGB色彩空间表示。

       在RGB颜色空间中,任意色光F都可以用R、G、B三色不同分量的相加混合而成:F=r[R]+r[G]+r[B]。RGB色彩空间还可以用一个三维的立方体来描述。当三基色分量都为0(最弱)时混合为黑色光;当三基色都为k(最大,值由存储空间决定)时混合为白色光。

                

RGB555

       RGB555是一种16位的RGB格式,各分量都用5位表示,剩下的一位不用。

       高字节 -> 低字节:XRRRRRGGGGGBBBBB

RGB565

       RGB565也是一种16位的RGB格式,但是R占用5位,G占用6位,B占用5位。

RGB24

       RGB24是一种24位的RGB格式,各分量占用8位,取值范围为0-255。

RGB32

       RGB24是一种32位的RGB格式,各分量占用8位,剩下的8位作Alpha通道或者不用。

       RGB色彩空间采用物理三基色表示,因而物理意义很清楚,适合彩色显象管工作。然而这一体制并不适应人的视觉特点。因而,产生了其它不同的色彩空间表示法。

YUV颜色空间

       YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法。在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和两个色差总共三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V信号分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

       YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。

       YUV和RGB互相转换的公式如下(RGB取值范围均为0-255)︰

Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
R = Y + 1.14V
G = Y - 0.39U - 0.58V

HSV颜色空间

     HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。

CIE-RGB颜色空间

       这个模型是由真实的人眼颜色匹配实验得出的模型,RGB分别表示那三个固定波长的光的份量。

CIE-XYZ颜色空间

       就是根据CIE-RGB进行变换得到的颜色模型,XYZ分别表示三个假想色的光的份量。通常简写为XYZ颜色模型。   

      

Lab颜色空间

       同RGB颜色空间相比,Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。下图所示为Lab颜色空间的图示;

      

参考

       https://blog.csdn.net/LG1259156776/article/details/48317339


原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/100976153


转载:https://blog.csdn.net/qq21497936/article/details/100976153
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场