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. view组件的封装是否需要特有模型?

    必须需要. 现在接手的老项目,所有自定义组件全部使用的原始的全量数据,作为模型给view用来展示. 结果发现,基本数据的选择错误,需要选择另一个数据作为基本数据,这导致一个很麻烦的问题,需要改动全部的 ...

  2. MongoDB -MSC集群的部署

    一.Shard节点配置过程 1. 目录创建:mkdir -p /mongodb/38021/conf  /mongodb/38021/log  /mongodb/38021/datamkdir -p ...

  3. 谈谈MySQL 索引

    1.索引是什么 索引(Index)是帮助MySQL高效获取数据的数据结构.我们可以简单理解为:索引的目的在于提高查询效率. 2.原理 索引的数据结构是B+树,原理图如下 关于B+树的详细介绍,可以参见 ...

  4. SqlServer2008查询性能优化_第一章

  5. undefined和nul

  6. DevOps - 从渐进式交付说起(含实践 Demo)

    作者:CODING - 王炜 1. 开篇 如果让你主导一款千万.甚至亿级用户产品的功能迭代,你会怎么做?你需要面对的挑战可能来自于: 商业战略的变化带来新的产品诉求,而产品的任何改动哪怕仅是界面调整, ...

  7. UML ——六种依赖关系.md

    在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Compos ...

  8. MethodHandle(方法句柄)系列之二:方法句柄的简单使用

     二话不说,上代码 /** * * @author LiuYeFeng<897908343@qq.com> * @date 2015年4月8日 下午10:41:13 * @CopyRigh ...

  9. Java实现 蓝桥杯VIP 算法训练 Hankson的趣味题

    问题描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现 在,刚刚放学回家的Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解了如 ...

  10. Java实现蓝桥杯勾股定理

    勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形. 已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数. 求满足这个条件的不同直角三角形的个数. [数据格式] 输入一 ...