参考链接:https://mp.weixin.qq.com/s/SaCqrhd8RVeKGDqo6vhUjg

原创 gloomyfish OpenCV学堂

图像色彩空间与应用转换

引言

重新写了一下图像色彩空间相关的知识,希望给大家多一点背景多点了解,不说别的,看完了肯定会涨知识。

RGB色彩空间

图像处理最基础的知识点之一就是图像色彩跟颜色模型,对计算机来说表示一张图像,只是一些零壹的二进制值,但是对人眼来说看到的都是一些可见光,而且人眼只对三种可见光比较敏感,分别是红色(red)、绿色(green)、蓝色(blue)。这个就是最基本的RGB颜色模型,三种颜色的波长范围表示如下:

Blue: 450–495 nmGreen: 495–570 nmYellow: 570–590 nm

针对人眼对颜色这个物理现象的生物感知表达模型,国际照明协会在1931年发布了一个颜色模型/色彩空间,表示如下:

因此就出现了对应颜色模型的色彩空间CIE XYZ模型,对于的表示色度跟亮度表示,图示如下:

从这个上面看不到Z,其实Z是表示颜色得亮度,或者深度,所以CIE XYZ颜色模型的这个图又被称为CIE 色度图。CIE XYZ颜色模型表示的范围比较大,所以后来微软跟惠普就提出了一个它的子集的颜色模型sRGB色彩空间,其中S是英文单词标准的首字母,sRGB色彩空间的表示如下:

上面的黑色三角形区域就称为sRGB色彩空间,被广泛应用在个人电脑显示器、打印机、数码相机中,占据了大量市场份额、到了90年代的时候Adobe公司提出了一个新RGB色彩空间模型Adobe RGB色彩空间,它比sRGB色彩空间有更大的取值范围,因此色彩更加细腻更加丰富,它的色彩空间图示如下:

从图中可以看成Adobe RGB色彩空间是比sRGB色彩空间大的,但是这个也有缺陷,就是不同色彩空间生成的彩色图像,在不同的设备上显示或者浏览会出现色差,为了解决这个问题,需要对不同色彩空间之间建立转换模型,实现不同色彩空间模型的转。后来RGB色彩空间就被大家玩坏了,现在常用的RGB色彩空间如下:

其中值得关注的部分是sRGB跟CMYK之间的相互转换,这个转换之后会导致很明显的色彩差异,原因在于CMYK色彩空间又一部分不在sRGB内部,所以这种情况下,需要对RGB色彩空间进行非线性变换,获得颜色补偿。原因在于多数商业打印机都是基于四色(Cyan, Yellow, Magenta and Black),无法打印一些sRGB范围的颜色,所以必须进行非线性变换跟补偿。这个其中最常见的就是Gamma校正。

非RGB色彩空间

RGB色彩空间比较丰富,但是它也是有缺点的,最大的缺点就是无法直观的区分图像颜色、亮度、饱和度等值。所以我们需要一些更加直观的图像色彩空间,排在第一位的就是HSV色彩空间,它直观,容易理解,因此在图像处理非常有用。

HSV色彩空间

RGB立方图色彩空间无法很好区分颜色与亮度的关系,要单独调整颜色或者亮度不是很方便,这个时候HSV色彩空间是一个很好的选择,它对颜色与亮度有着很好的区分度,HSV色彩空间图示如下:

解释如下:

  • H(Hue) 表示颜色通道,不同的值表示不同的颜色范围

  • S表示饱和度通道,表示色泽

  • V表示亮度通道,代表图像亮度高低级别

在H、S、V通道上对图像亮度跟颜色或者饱和度的调整就非常方便了,另外对一些特定的颜色值进行分离也比较方便了。

YCrCb色彩空间

YCrCb色彩空间被开发作为当时的数字分量视频的标准,它跟YUV色彩空间有着一定相似性,它的三个通道的取值范围分别被定义为:

  • Y通道:16~235

  • Cr通道:16~240

  • Cb通道:16~240

需要特别注意的是,RGB到YCrCb的色彩空间转换时候,不同的YCrCb色彩空间标准会有不同,下面标清电视跟高清电视上YCrCb的色彩差异:

很显然它们的转换公式也会有所不同,所以千万不用看到不同转换公式就大惊小怪的!

LAB色彩空间

LAB色彩空间又名CIE Lab / LAB,它的图示如下:

其中:

  • L通道表示亮度值

  • A通道表示红色/绿色值

  • B通道表示蓝色/黄色值

在LAB色彩空间,L表示亮度分量、AB表示颜色通道,所以有时候LAB色彩空间处理图像也会必RGB色彩空间好用,会有意想不到的好结果。

OpenCV实现

OpenCV色彩空间相互转换与操作的函数主要有两个,其中支持色彩空间转换的函数为:

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

参数解释如下

  • src 表示输入图像

  • dst 表示输出图像

  • code 表示空间转换代码,支持常见的各种色彩空间转换

从色彩空间中提取不同色颜色值函数:

void cv::inRange(InputArray src,InputArray      lowerb,InputArray      upperb,OutputArray   dst)

参数解释如下:

  • src是输入图像

  • lowerb是取值范围最小值

  • upperb是取值范围最大值

  • dst是输出的mask图像,二值的

一个例子,绿色背景对象上前景对象提取,先看一下效果:

相关代码如下:

 1#include <opencv2/opencv.hpp>2#include <iostream>34using namespace cv;5using namespace std;67int main(int argc, const char *argv[])8{9    Mat src = imread("D:/vcprojects/images/cat.jpg");
10    if (src.empty()) {
11        printf("could not load image...\n");
12        return -1;
13    }
14    namedWindow("input", WINDOW_AUTOSIZE);
15    imshow("input", src);
16
17    // RGB to HSV
18    Mat hsv;
19    cvtColor(src, hsv, COLOR_BGR2HSV);
20    imshow("hsv", hsv);
21
22    // RGB to YUV
23    Mat yuv;
24    cvtColor(src, yuv, COLOR_BGR2YUV);
25    imshow("yuv", yuv);
26
27    // RGB to YUV
28    Mat ycrcb;
29    cvtColor(src, ycrcb, COLOR_BGR2YCrCb);
30    imshow("ycrcb", ycrcb);
31
32    Mat src2 = imread("D:/javaopencv/tinygreen.png");
33    imshow("src2", src2);
34    cvtColor(src2, hsv, COLOR_BGR2HSV);
35    Mat mask;
36    inRange(hsv, Scalar(35, 43, 46), Scalar(99, 255, 255), mask);
37    imshow("mask", mask);
38
39    waitKey(0);
40    return 0;
41}

opencv 图像色彩空间与应用转换相关推荐

  1. 图像色彩空间与应用转换

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达引言 重新写了一下图像色彩空间相关的知识,希望给大家多一点背景多点了 ...

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

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

  3. python数字图像处理、色彩空间类型转换_Python+OpenCV图像处理—— 色彩空间转换...

    一.色彩空间的转换 代码如下: #色彩空间转换 import cv2 as cv def color_space_demo(img): gray = cv.cvtColor(img, cv.COLOR ...

  4. Python+OpenCV:色彩空间转换

    Python+OpenCV:色彩空间转换 ############################################################################### ...

  5. day3 - 图像在不同色彩空间间的转换

    本期将了解三种不同的颜色空间,RGB,HSV,GRAY.会使用OpenCV来读取三种颜色空间,并且操作不同空间的转换,观察不同颜色空间的特点. 完成本期内容,你可以: 了解RGB,HSV,GRAY三种 ...

  6. Opencv_03 图像色彩空间转换

    文章目录 一. 色彩空间介绍 ① RGB/BGR色彩空间 ② 为什么Opencv中采用的是BGR ③ HSV色彩空间 二.色彩空间转换 ① cvtColor()函数原型 ② 颜色空间转换案例 一. 色 ...

  7. openCV图像矩阵Mat和二维数组的互相转换

    openCV图像矩阵Mat和二维数组的互相转换 在openCV的应用中,我们获取图像的矩阵信息很简单.但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算.那么我们就需要把openCV读取 ...

  8. OpenCV图像颜色模型转换:cvtColor函数的使用

    Opencv提供了不同颜色模型之间转换的函数cvtColor,可以很容易的将一种颜色模型转换为另一种颜色模型. 原型 CV_EXPORTS_W void cvtColor( InputArray sr ...

  9. cv_bridge用于ROS图像和OpenCV图像的转换

    ROS是机器人领域中比较受到关注的一种系统,它的应用比较方便而且有许多的工具比如传感器驱动包可以直接使用.但是ROS对于传感器数据有自己的格式和规范.而在OpenCV中,图像是以Mat矩阵的形式存储的 ...

最新文章

  1. activeMQ 填坑记
  2. 无聊中安装的MAC OS截图欣赏
  3. [收集] C++ memset ,memcpy 和strcpy 的区别
  4. 【正一专栏】读《艾思奇哲学文选第六卷》
  5. 计算机dns的工作原理,DNS的工作原理图解说明
  6. python 几种常用测试框架
  7. 第十四天 网页初步
  8. html 弹窗 支持ie8,浏览器兼容性的问题、支持IE8、不支持IE6、想解决这个问题、两个都支持、...
  9. paip.软件及网站项目开发效率低下的思索与改进
  10. redis等缓存和mysql的数据同步问题解决思路
  11. 这些书你读过一多半,你就是编程大牛!
  12. ens2sym <- select(org.Hs.eg.db, keys=row.names(pc9_removebatch_b12),columns=c(“ENTREZID“,“SYMBOL“),
  13. linux鼠标怎么取出来,浅析linux中鼠标数据读取
  14. 1688搜索店铺列表 API
  15. 使用pyautogui和inspect快速准确定位鼠标位置
  16. Android MVP 架构设计 (一)
  17. [墨者学院] Windows硬盘文件分析取证(新建的用户名)
  18. java计算机毕业设计Web商铺租赁管理系统MyBatis+系统+LW文档+源码+调试部署
  19. 利用HTML+CSS进行页面布局(div的浮动效果)
  20. 三年的工作-软通动力

热门文章

  1. 查看网页记住密码的密码明文
  2. HADOOP MapReduce 处理 Spark 抽取的 Hive 数据【解决方案一】
  3. 不用下软件,上传模型就能直接在网页预览啦
  4. 【计算机网络】【应用层-6】
  5. 在迅影prayaya中phpcms系统图片上传功能无效
  6. BZOJ P4554 [Tjoi2016Heoi2016]游戏
  7. 一个计算机爱好者的不完整回忆(六)
  8. BINDENG(Gcoge) 技术内幕--Bindeng(Gcoge) 的特色---无以伦比,统领全球!
  9. 使用分光光度计有哪些注意事项?简易型仪器和中档型仪器的区别看这里
  10. 印度的软件工业(建议程序员必读)