颜色空间

要用三种或更多的特征来指定一种颜色,有许多的方法被称为颜色空间或者颜色模型。
如何选取其中一种方法来表示一副图像要依赖于执行的运算。
不同的颜色空间的转换,Opencv提供方法

void cvtColor(InputArray src, Output dst, int code, int dstCn=0)

code : 这是颜色空间的转换代码。例如COLOR_BGR2GRAY
dstCn:这是目标图形的通道数,如果为0或省略,则通道数有src和code自动产生。

常用的颜色空间:

RGB颜色空间

在RGB中,一幅图像有三个独立的图像平面或通道组成:红,绿,蓝(以及第四个通道透明度)。
如下代码展示了,加载RGB图像,并在灰度空间和颜色空间中拆分并显示每个特定的通道。

void split(InputArray m, OutputArrayOfArrays mv)
1. 将图像的每个通道保存在mv中
2. mv声明为vector mv
void merge(InputArrayOfArrays mv, OutputArray dst)
1. 将mv和并称一个图像dst

#include "opencv2/opencv.hpp"
#include "opencv2/opencv_modules.hpp"
#include "opencv2/highgui/highgui.hpp"
#include<iostream>
using namespace cv;
using namespace std;
vector<Mat> showSeqratedChannels(vector<Mat> channels);
int  main() {Mat image = imread("test.jpg");vector<Mat> channels;split(image, channels);         //分割图像//用灰度级显示通道namedWindow("Origin", WINDOW_NORMAL);imshow("Origin", image);namedWindow("Blue channel",WINDOW_NORMAL);imshow("Blue channel", channels[0]);namedWindow("Green channel", WINDOW_NORMAL);imshow("Green channel", channels[1]);namedWindow("Red channel", WINDOW_NORMAL);imshow("Red channel", channels[2]);cout << channels.size() << endl;//显示BGR中的通道vector<Mat> separated = showSeqratedChannels(channels);namedWindow("Blue channel", WINDOW_AUTOSIZE);imshow("Blue channel", separated[0]);namedWindow("Green channel", WINDOW_AUTOSIZE);imshow("Green channel", separated[1]);namedWindow("Red channel", WINDOW_AUTOSIZE);imshow("Red channel", separated[2]);cout << separated[0].size() << endl;cout << separated[0].rows << endl;cout << separated[0].cols << endl;waitKey();
}
//这个函数,将channels中的每个波段分别加上两个波段,形参三个RGB通道
//其余两个通道介入的都是0像素。
vector<Mat> showSeqratedChannels(vector<Mat> channels) {vector<Mat> seqaratedChannels;for (int i = 0; i < 3; i++) {Mat zero = Mat::zeros(channels[0].rows, channels[0].cols, channels[0].type());vector<Mat>aux;for (int j = 0; j < 3; j++) {if (j == i) aux.push_back(channels[i]);elseaux.push_back(zero);}Mat chann;merge(aux, chann);             //chann为输出的容器seqaratedChannels.push_back(chann);}return seqaratedChannels;
}

原始的图像如下所示:

用灰度级显示通道:

显示BGR中的通道:

灰度图像与RGB图像的转变。
RGB[A]转换为灰度:Y=0.299*R+0.587*G+0.114*B;
cvtColor方法的缺陷就是是的原始图像的对比度丢失,从上面的式子中可以看到。

//利用opencv函数将彩色变为灰度图像
cvtColor(image,imageGray,COLOR_BGR2GRAY);

CIE XYZ颜色空间

CIE XYZ系统用一个亮度分类Y来描述颜色,他与人类视觉的亮度灵敏度和两个附加通道X,Z相关。
RGB和CIE XYZ之间的转换颜色空间代码是:

COLOR_BGR2XYZ
COLOR_RGB2XYZ
COLOR_XYZ2BGR
COLOR_XYZ2RGB

它与RGB的转换公式如下图所示:


下面代码是将RGB图像转换成XYZ空间,以及在灰度空间和颜色空间中拆分并显示特定通道。

#include "opencv2/opencv.hpp"
#include "opencv2/opencv_modules.hpp"
#include "opencv2/highgui/highgui.hpp"
#include<iostream>
using namespace cv;
using namespace std;
vector<Mat> showSeqratedChannels(vector<Mat> channels);
int  main() {Mat image = imread("cute.jpg");namedWindow("Origin", WINDOW_AUTOSIZE);imshow("Origin", image);cvtColor(image, image, CV_BGR2XYZ);namedWindow("Origin_XYZ", WINDOW_AUTOSIZE);imshow("Origin_XYZ", image);vector<Mat> channels;split(image, channels);         //分割图像//用灰度级显示通道namedWindow("Blue channel_GRAY",WINDOW_AUTOSIZE);imshow("Blue channel_GRAY", channels[0]);namedWindow("Green channel_GRAY", WINDOW_AUTOSIZE);imshow("Green channel_GRAY", channels[1]);namedWindow("Red channel_GRAY", WINDOW_AUTOSIZE);imshow("Red channel_GRAY", channels[2]);cout << channels.size() << endl;显示BGR中的通道vector<Mat> separated = showSeqratedChannels(channels);for (int i = 0; i < 3; i++) {cvtColor(separated[i], separated[i], COLOR_XYZ2BGR);     //在将其转成BGR中显示通道}namedWindow("Blue channel", WINDOW_AUTOSIZE);imshow("Blue channel", separated[0]);namedWindow("Green channel", WINDOW_AUTOSIZE);imshow("Green channel", separated[1]);namedWindow("Red channel", WINDOW_AUTOSIZE);imshow("Red channel", separated[2]);cout << separated[0].size() << endl;cout << separated[0].rows << endl;cout << separated[0].cols << endl;waitKey();
}
vector<Mat> showSeqratedChannels(vector<Mat> channels) {vector<Mat> seqaratedChannels;for (int i = 0; i < 3; i++) {Mat zero = Mat::zeros(channels[0].rows, channels[0].cols, channels[0].type());vector<Mat>aux;for (int j = 0; j < 3; j++) {if (j == i) aux.push_back(channels[i]);elseaux.push_back(zero);}Mat chann;merge(aux, chann);             //chann为输出的容器seqaratedChannels.push_back(chann);}return seqaratedChannels;
}



YCrCb颜色空间

该颜色空间广泛的用于视频压缩和图像压缩方案,不能算是纯粹的颜色空间,因为它是RGB颜色空间的一种解码方式。
该颜色空间广泛的应用于MPEG和JPEG等视频和图像压缩方案。

Y表示亮度
Cr : RGB空间R通道和Y差值
Cb: RGB空间B通道和Y差值

RGB和YCrCb之间的转换颜色空间代码是:

COLOR_BGR2YCrCb
COLOR_RGB2YCrCb
COLOR_YCrCb2BGR
COLOR_YCrCb2RGB

计算的过程如下图所示:

同理,将一副RGB图像转换成YCrCb空间,以及在灰度空间和颜色空间中拆分并显示特定通道代码同上述非常类似,因此不再重复。

效果如下图所示:



HSV颜色空间

HSV颜色空间属于面向色度的颜色坐标系的一种,这种颜色模型接近于人类颜色感知的仿真模型,而在其他颜色模型中,例如RGB,一副图像被视为3中基色的叠加。

H(hue): 色调,取值[0,1],对应颜色的种类,颜色从红,通过黄,绿,蓝,紫和黑到红。
S(saturation):饱和度,取值[0,1],对应预色调种类从不饱和(灰度梯度)到完全饱和(无白色)。
V(value):取值[0,1],对应色彩有暗变亮。

OpenCV中使用在RGB,HSV之间变换的颜色空间转换代码:

COLOR_BGR2HSV
COLOR_RGB2HSV
COLOR_HSV2BGR
COLOR_HSV2RGB

如果src图像格式是8位或16位,则首先转成一个浮点格式,将其值变化成0到1之间,在计算:

OpenCV学习笔记(八)--颜色空间及转换相关推荐

  1. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  2. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  3. opencv学习笔记八--答题卡识别

    opencv学习笔记八--答题卡识别 导入工具包 定义函数 扫描 自适应阈值处理 检测每一个选项的轮廓 对轮廓进行排序以获取序号 打印结果 参考 导入工具包 #导入工具包 import numpy a ...

  4. OpenCV学习笔记——HSV颜色空间超极详解inRange函数用法及实战

    目录 一.HSV颜色系统简介 二.HSV值对颜色的影响 三.HSV和RGB的互相转化 四.OpenCV中的HSV颜色体系 五.OpenCV实战--两种方法使用OpenCV进行颜色分割 六.inRang ...

  5. OPenCV学习笔记八-图像的滤波

    主要记录三种滤波函数的使用 VS2017 + Opencv3.2.0#include <opencv2/opencv.hpp> #include <iostream>using ...

  6. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  7. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  8. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  9. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

最新文章

  1. HA-heartbeat高可用双击热备安装配置详解
  2. 一个WEB网站高并发量的解决方案
  3. MySQL数据库Innodb储存引擎----储存页的结构
  4. 使用jQuery OCUpload实现excel文件一键上传功能
  5. qt获取图像的每个像素rgb_【可视化-1】认识图像,从图像可视化开始
  6. java判断题_【Java判断题】请大神们进来看下、这些判断题你都知道多少~
  7. php报表数据打印机,通过打印机打印带打印功能的php表
  8. 数据库读取前几条记录的SQL语句大全
  9. 忘记mysql root管理员帐号密码处理方法
  10. el表达式 多条件判断
  11. dojochina ExtJS视频解压密码
  12. git拉取远程分支到本地分支或者创建本地新分支
  13. 想要好用的录音转文字软件?推荐三款音频转文字软件免费版
  14. 国外在线Md5,md4,mysql,Sha1,NTLM破解网站
  15. Mysql登录默认密码
  16. Atitit 艾提拉整理清明节的诗歌集合 清明节的特征 万物复苏 百草发芽 尝试从股市 其他外国诗歌集 得到清明的诗歌 约谈春天 歌颂春天 下雨 不见方三日、 夜来风雨声,花落知多少。(
  17. mac苹果安装百度网盘--日常工作记录
  18. Effective c++笔记
  19. 世界尽头与冷酷仙境(村上春树)-摘录
  20. 牛客-js练习|错题本+知识点总结-break、try...catch...finally(01)

热门文章

  1. 工程师、程序员、码农有什么区别?
  2. 微信支付成功,如何刷新用户当前页面的余额
  3. java工程师月薪2W需要几年经验
  4. cjjjjjjjjjjj
  5. Directx11与PhysX的结合
  6. linux多网卡聚合
  7. Apache Dubbo系列:泛化调用
  8. SRS+metaRTC+FFmpeg助力直播进入webrtc直播互动新时代
  9. VMware 其他主机硬件对象的状态报警(HPE DL380 Gen10)
  10. tokuDB 使用详解及其注意事项(2)