专栏首页贾志刚-OpenCV学堂图像色彩空间与应用转换

图像色彩空间与应用转换

引言

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

RGB色彩空间

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

Blue: 450–495 nm
Green: 495–570 nm
Yellow: 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图像,二值的

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

相关代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char *argv[])
{
    Mat src = imread("D:/vcprojects/images/cat.jpg");
    if (src.empty()) {
        printf("could not load image...\n");
        return -1;
    }
    namedWindow("input", WINDOW_AUTOSIZE);
    imshow("input", src);

    // RGB to HSV
    Mat hsv;
    cvtColor(src, hsv, COLOR_BGR2HSV);
    imshow("hsv", hsv);

    // RGB to YUV
    Mat yuv;
    cvtColor(src, yuv, COLOR_BGR2YUV);
    imshow("yuv", yuv);

    // RGB to YUV
    Mat ycrcb;
    cvtColor(src, ycrcb, COLOR_BGR2YCrCb);
    imshow("ycrcb", ycrcb);

    Mat src2 = imread("D:/javaopencv/tinygreen.png");
    imshow("src2", src2);
    cvtColor(src2, hsv, COLOR_BGR2HSV);
    Mat mask;
    inRange(hsv, Scalar(35, 43, 46), Scalar(99, 255, 255), mask);
    imshow("mask", mask);

    waitKey(0);
    return 0;
}

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL),作者:gloomyfish

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手撕 | 深度神经网络卷积层计算加速与优化

    最后一页没画,但是基本上就是Filter Matrix乘以Feature Matrix的转置,得到输出矩阵Cout x (H x W),就可以解释为输出的三维B...

    OpenCV学堂
  • OpenCV中的透视变换介绍

    透视变换原理 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping)。我们知道在图像的仿射...

    OpenCV学堂
  • Pycharm中一些不为人知的技巧

    工欲善其事必先利其器,Pycharm 是最受欢迎的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,如果能挖掘出里面实用技巧,能带来事半...

    OpenCV学堂
  • Mybatis源码之StatementType

      在mybatis中StatementType的值决定了由什么对象来执行我们的SQL语句。本文来分析下在mybatis中具体是怎么处理的。

    用户4919348
  • 聊聊sharding-jdbc的ShardingMasterSlaveRouter

    本文主要研究一下sharding-jdbc的ShardingMasterSlaveRouter

    codecraft
  • 聊聊sharding-jdbc的ShardingMasterSlaveRouter

    本文主要研究一下sharding-jdbc的ShardingMasterSlaveRouter

    codecraft
  • 使用Sublime Text编辑器,你所不知道的11个秘密!

    腾讯NEXT学位
  • 深度学习巅峰之年:技术、开源、兼并和硬件发展全回顾(附论文合集)

    【新智元导读】本文是对2016年深度学习领域的进展的综述和回顾,介绍了2016年该领域的一些重要研究成果,包括无监督学习、增强学习、生成对抗网络等,以及产业中的...

    新智元
  • 使用Sublime Text编辑器 你所不知道的11个秘密

    腾讯NEXT学位
  • 你的隐私正在被泄露

    之前跟朋友谈天说地,聊到了国内关于用户隐私的问题,这是一个很深沉的话题,深到我都不敢开口,万一我说的话被泄漏了呢?朋友让我看了 2018 年 4 月 12 日的...

    周俊辉

扫码关注云+社区

领取腾讯云代金券