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. Create First Application

    Node.js创建第一个应用 Node.js开发的目的就是为了用JavaScript编写Web服务器程序, 在使用Node.js时,不仅仅是在实现一个应用,同时还实现了整个HTTP服务器.在创建Nod ...

  2. 【github龟速克星】如何下载快如闪电

    详见:https://www.kesci.com/home/project/5e96fe1ae7ec38002d03cd56 借助第三方网站:https://g.widora.cn/

  3. SVN强制添加备注

    1.进入仓库project1/hooks目录,找到pre-commit.tmpl文件 cp pre-commit.tmpl pre-commit 2.编辑pre-commit文件, 将: $SVNLO ...

  4. golang垃圾回收机制

    golang的GC,1.8通过混合写⼊屏障, 使得STW降到了sub ms.go语言中程序代码执行和垃圾回收是并发执行的. 当前Go GC特征 :三色标记,并发标记和清扫,非分代,非紧缩,混合写屏障. ...

  5. eatwhatApp开发实战(十三)

    这次内容,我们就项目中添加商店名称的EditText进行修改,让添加按钮随着edittext的内容而改变. 上代码,首先是xml文件上对两个控件的修改: <RelativeLayout andr ...

  6. [SD心灵鸡汤]010.每月一则 - 2016.02

    1.世上只有一种英雄主义,就是在认清生活真相之后依然热爱生活. 2.要想赢,就一定不能怕输.不怕输,结果未必能赢.但是怕输,结果则一定是输. 3.你要做的就是别人换不掉的,那你做不到怪谁,就是你自己没 ...

  7. [批处理教程之Shell]001.文本处理

    在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命令,然后调用相应的应用程序. 同时 ...

  8. & 加密

    接口参数中sign加密方式: 1. 签名算法使用SHA256: 2. 服务方和消费方都需要校验签名: 3. 签名生成步骤: 第一步,设所有发送或者接收到的数据为集合M1,将集合M1内非空参数值的参数按 ...

  9. Rocket - tilelink - Broadcast

    https://mp.weixin.qq.com/s/-pjCLzzincJz0Z66orx8kg   介绍Broadcast的实现.   ​​   1. 基本介绍   TLBroadcast实现的是 ...

  10. 又发现一款纯js开源电子表格Luckysheet

    据官网介绍这个电子表格插件,是一款纯前端类似excel的在线表格,功能强大.配置简单.完全开源. 官网链接: Luckysheet官网 在线DEMO 特性包含: 表格设置,包括冻结行列.合并单元格.筛 ...