若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/100976153
目录
OpenCV开发专栏
《OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的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(可将YCrCb用YUV替代) |
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