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. MySQL 8.0用户及安全管理

    用户的功能 登录数据库 管理数据库对象 用户的组成 用户名@'白名单' 白名单: % 10.0.0.10 .% 10.0.0.5% 10.0.0.0/255.255.254.0 oldguo.com ...

  2. Java——java.lang.NumberFormatException: For input string: ""

    java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.f ...

  3. Java——动态创建Class(不写入文件,直接从内存中创建class)

    原文:https://blog.csdn.net/zhao_xinhu/article/details/82499062#commentsedit 参考:https://www.cnblogs.com ...

  4. 正确去除隐藏在WordPress系统各处的版本号

    使用WordPress的博主都有一个普遍的意识,就是为了安全而移除WordPress的版本号,以免不良用心的人利用旧版本的漏洞对网站进行攻击. WordPress会在前端代码head中加入以下代码(3 ...

  5. spring——bean自动装配

    注意:自动装配功能和手动装配要是同时使用,那么自动装配就不起作用. beans.xml <?xml version="1.0" encoding="UTF-8&qu ...

  6. JSP+SSM+Mysql实现的图书馆预约占座管理系统

    项目简介 项目来源于:https://gitee.com/gepanjiang/LibrarySeats 因原gitee仓库无数据库文件且存在水印,经过本人修改,现将该仓库重新上传至个人gitee仓库 ...

  7. 关于做好ASO工作的十点有效建议

    导语: 互联网上关于如何做好ASO的内容多种多样,鱼目混珠.有从数据分析角度的方法论:有从运营工具角度的方法论:也有从实践角度看如何做好的. 本文将“对症下药”,从影响ASO的十大因素出发,整理出一份 ...

  8. [工具-002]把png图片转换成ico图标

    最近我收到了上级的一个需求,我们需要使用产品的png图片,批量转换成ico图片,然后调用上一篇的方法,替换可执行程序的图标.一开始查看资料的时候,C#有直接可以转成ico图片的方法,很简单.但是生成的 ...

  9. Matlab GUI程序设计入门——信号发生器+时域分析

    背景:学习matlab gui编程入门,完成一个基于GUIDE的图形化界面程序,结合信号生成及分析等. 操作步骤: 1.新建程序 新建一个GUIDE程序 这里选择第一个选项,即创建一个空白的GUIDE ...

  10. 如何让a==1&&a==2&a==3成立

    /* * == 进行比较的时候,如果左右两边数据类型不一样,则先转换为相同的数据类型,然后在进行比较 *    1.{} == {} false 两个数据进行比较,比较的是堆内存的地址 *    2. ...