Color spaces in OpenCV (C++ / Python)

几天前我的朋友马克告诉我关于构建一个基于计算机视觉的自动化魔方求解器的想法,我很好奇。他试图使用颜色分割来查找立方体的当前状态。虽然他的颜色分段代码在晚上在他的房间里工作得很好,但是在白天他的房间外面,他的颜色分解代码却崩溃了!

他问我求助,我立即明白他哪里出了问题。像许多其他业余电脑视觉爱好者一样,他在做色彩分割时没有考虑不同照明条件的影响。我们在许多计算机视觉应用中遇到了这个问题,这些计算机视觉应用涉及肤色检测,交通灯识别等基于颜色的分割。

在本文中,我们将介绍计算机视觉中使用的一些重要色彩空间。我们不会在Wikipedia上找到它们背后的理论。相反,我们会发展一个基本的直觉,并学习一些重要的属性,这些属性将在以后作出决定时很有用。

1. 准备工作……

让我们加载同一个立方体的2个图像。 它将默认以BGR格式加载。第一张照片是在阳光明媚的室外环境下拍摄的,第二张照片是在正常照明条件下拍摄的。

2. RGB颜色空间

RGB色彩空间具有以下属性:

  • 这是一个加色空间,通过红,绿和蓝色值的线性组合获得颜色
  • 三个通道通过撞击表面的光量相关联

让我们把这两幅图像分解成它们的R,G和B分量,并观察它们以获得更多的色彩空间

如果你看蓝色的通道,可以看到在室内照明条件下,第二张图像中的蓝色和白色的部分看起来相似,但是在第一张图像中有明显的差别。这种不均匀性使得在这个色彩空间中基于颜色的分割非常困难。此外,两个图像的值之间存在总体差异。下面我们总结了与RGB颜色空间相关的固有问题:

  • 显着的感知不均匀性
  • 色度(颜色相关信息)和亮度(强度相关信息)数据的混合

3. LAB色彩空间

Lab色彩空间有三个组件。

  • L - 亮度(强度)
  • a - 从绿色到品红色的一种颜色成分
  • b - 颜色分量从蓝色到黄色

Lab色彩空间与RGB色彩空间大不相同。在RGB色彩空间中,色彩信息被分成三个通道,但相同的三个通道也编码亮度信息。另一方面,在Lab色彩空间中,L通道独立于色彩信息,仅对亮度进行编码。另外两个通道编码颜色。

它具有以下属性:

  • 感知上统一的颜色空间,接近我们如何看待颜色
  • 独立于设备(捕获或显示)
  • 在Adobe Photoshop中广泛使用
  • 通过一个复杂的变换方程与RGB色彩空间相关联

让我们看看Lab色彩空间中的两个图像分成三个通道。

从图中可以清楚地看出,照度的变化主要影响L分量,包含颜色信息的A和B成分没有经历大的变化。

在B分量中,绿色,橙色和红色(它们是A分量的极值)的相应值没有改变,类似地,蓝色和黄色(它们是B分量的极值)的相应值在A分量中也没有太大变化。

4. YCrCb色彩空间

YCrCb颜色空间是从RGB颜色空间导出的,并具有以下三个组件:

  • Y - 伽马校正后从RGB获得的亮度或亮度(Luma )分量
  • Cr = R - Y(红色分量距离Luma有多远)
  • Cb = B - Y(蓝色分量距离Luma的有多远)

此颜色空间具有以下属性:

  • 将亮度和色度分量分离成不同的通道
  • 主要用于电视传输的压缩(Cr和Cb组件)
  • 设备依赖

对于照度变化,可以针对强度和颜色分量进行类似的观察。

  • 与LAB相比,红色和橙色之间的感知差异甚至在户外图像中更小
  • 所有3个部件中的白色都发生了变化

5. HSV色彩空间

HSV色彩空间有以下三个组成部分:

  • H: 色调(主波长)
  • S: 饱和度(纯度/颜色的阴影)
  • V: 强度

我们列举一些属性:

  • 最好的事情是,它只使用一个通道来描述颜色(H),使得指定颜色非常直观
  • 设备依赖

  • 在这两组图像中,H分量非常相似,即使在光照变化下,颜色信息也是完整的
  • S组件在两幅图像中也非常相似
  • V分量捕捉到的光线量因此会随着光照的变化而变化
  • 红色的室外和室内图像的价值之间存在着巨大的差异。这是因为色调表现为一个圆形,红色是在起始角度。所以,可能需要[300,360]和[0,60]之间的值。

【转载】自动化魔方求解器的Bug——选择合适的色彩空间的更多相关文章

  1. FLUENT不同求解器离散格式选择【转载】

    转载自:http://blog.163.com/wu_yangfeng/blog/static/16189737920104158950438/ 离散格式对求解器性能的影响 控制方程的扩散项一般采用中 ...

  2. (转载)通过dbgrideh 从数据集中选择合适的记录

    通过dbgrideh 从数据集中选择合适的记录 //---------------------------------------------------------// 通过dbgrideh 从数据 ...

  3. pimpleFoam求解器 vs simpleFoam求解器 vs pisoFoam求解器 vs icoFoam

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-solving/68072-pimplefoam-vs-simplefoam ...

  4. 数学规划求解器lp_solve超详细教程

    前言 最近小编学了运筹学中的单纯形法.于是,很快便按奈不住跳动的心.这不得不让我拿起纸和笔思考着,一个至关重要的问题:如何用单纯形法装一个完备的13? 恰巧,在我坐在图书馆陷入沉思的时候,一位漂亮的小 ...

  5. [转载]基于TFS实践敏捷-修复Bug和执行代码评审

    本主题阐释了这些功能,以继续这一关注虚拟敏捷团队成员的一天的教程. Peter 忙于编写一些代码以完成积压工作 (backlog) 项任务.但是,他的同事发现了一个阻碍他们工作的 Bug,他想立即修复 ...

  6. Maxwell顺态求解器电磁力分析

    文源:技术邻 问题描述:求解一段通有正弦交流电的直导线在某一稳态磁场中的受力情况,并简单验证仿真结果. 模型介绍: 如上几何模型中10mm边长立方体代表永磁体,材料属性为材料库中的NdFe35,修改磁 ...

  7. SCIP | 数学规划求解器SCIP超详细的使用教程

    前言 小伙伴们大家好呀!继上次lp_solve规划求解器的推文出来以后,大家都期待着更多求解器的具体介绍和用法.小编哪敢偷懒,这不,赶在考试周之际,又在忙里偷闲中给大家送上一篇SCIP规划求解的推文教 ...

  8. win10安装z3求解器

    因为课程要求,我不得不接触求解器,之前有在ubuntu上装过一个叫stp的求解器,没怎么用: 今天在我的电脑(win10)上上装了一款更方便的求解器---z3,下面先详细介绍一下怎么安装和配置: 1. ...

  9. chtMultiRegionSimpleFoam求解器的热源不在边界上【翻译】

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-solving/126777-chtmultiregionsimplefoa ...

随机推荐

  1. 树点分治入门题poj1741

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24253   Accepted: 8060 Description ...

  2. json字符串转List集合

    public List<Map<String,PendingInfo>> jsonToList(String json){//PendingInfo可以换成其它bean类 Li ...

  3. golang基础教程——字符串篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第6篇文章,这篇主要和大家聊聊golang当中的字符串的使用. 字符串定义 golang当中的字符串本质是只读的字符 ...

  4. Yii2.0 URL美化功能Nginx与Apache配置文件

    NGinx: location / { index index.html index.htm index.php; try_files $uri $uri/ /index.php$is_args$ar ...

  5. iOS开发MD5、SHA1

    MD5: + (NSString *)md5:(NSString *)input { const char *cStr = [input UTF8String]; unsigned char dige ...

  6. MIT6.828准备:MacOS下搭建xv6和risc-v环境

    本文介绍在MacOS下搭建Mit6.828/6.S081 fall2019实验环境的详细过程,包括riscv工具链.qemu和xv6,对于Linux系统同样可以参考. 介绍 只有了解底层原理才能写好上 ...

  7. Azure Kubernetes 服务 (AKS)

    一.首先创建集群 1,注意:一定要选择Kubernets Service(红框处),上面的那一堆虚拟机都没有用, 2,设置好相关属性,集群大小可后面更改节点数,但是节点的大小不可更改 二.登陆集群 在 ...

  8. 搭建SpringCloud微服务框架:一、结构和各个组件

    搭建微服务框架(结构和各个组件) 简介 SQuid是基于Spring,SpringBoot,使用了SpringCloud下的组件进行构建,目的是想搭建一套可以快速开发部署,并且很好上手的一套微服务框架 ...

  9. JS实现PC端URL跳转到对应移动端URL

    在做移动端网站时,有时因技术问题或其他原因无法制作响应式版面,而移动端页面只能放到子目录下,但是手机端通过搜索引擎进入网站电脑端子页面,无法匹配到移动端页面,使得用户体验很不好,即影响排名也影响转化. ...

  10. Cypress系列(9)- Cypress 编写和组织测试用例篇 之 钩子函数Hook

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html Hook 就是常说的钩子函数,在 pyt ...