OpenCV实战之OpenCV中的颜色空间

目录
  • 1 不同的色彩空间
    • 1.1RGB颜色空间
    • 1.2 Lab色彩空间
    • 1.3  YCrCb颜色空间
    • 1.4 HSV颜色空间
  • 2 如何使用这些颜色空间进行分割
    • 2.1 获取特定颜色的颜色值
    • 2.2 应用分段阈值

在本教程中,我们将了解计算机视觉中常用的色彩空间,并将其用于基于颜色分割。我们还将用C ++和Python共享演示代码。

在进行色彩分割时很多项目没有考虑到不同光照条件的影响,会严重影响结果。在许多计算机视觉应用中遇到这个问题,涉及基于颜色的分割,如肤色检测,交通灯识别等。所以构建一个强大的色彩检测系统是很有必要的。

文章结构如下:

1首何在OpenCV中读取图像并将其转换为不同的颜色空间,并查看每个颜色空间的不同通道为我们提供的新信息。

2应用一个简单的颜色分割算法。

1 不同的色彩空间

在本节中,我们将介绍计算机视觉中使用的一些重要的色彩空间。我们不会描述它们背后的理论,我们只需要知道如何使用。

OpenCV颜色空间转换很简单,imread函数读取图像以BGR格式加载,cvtColor函数在不同的颜色空间之间进行转换。

下图是不同的照明下的立方体图像。第一张图像是在阳光明媚的室外条件下拍摄的,而第二张图像是在室内光线条件正常的情况下拍摄的。

1.1RGB颜色空间

RGB颜色空间具有以下属性: 1. 它是一种加色空间,其中颜色通过红色R,绿色G和蓝色B的线性组合获得。1. 物体光照会影响该颜色空间各个通道值,三个颜色通道是具有相关性的。 让我们将上面图像分成R,G和B分量并观察它们以更深入地了解色彩空间。

从下图可以看到如果你看蓝色通道,可以看到在室内光照条件下第二张图像中的魔方蓝色和白色部分看起来相似,但第一张图像有明显差异。这种不均匀性使得在该颜色空间中基于颜色的分割非常困难。此外,两个图像的值之间存在总体差异。因此RGB颜色空间存在颜色值分布不均匀以及色度和亮度混合在一起的问题。

1.2 Lab色彩空间

类似RGB空间,Lab也有三个图像通道。

  • L:亮度通道,表亮度。
  • a:颜色通道a,表示从绿色到洋红色的颜色。
  • b:颜色通道b,表示从蓝色到黄色的颜色。

Lab颜色空间与RGB颜色空间完全不同。在RGB颜色空间中,颜色信息被分成三个通道,但是相同的三个通道也包含亮度信息。另一方面,在Lab颜色空间中,L通道独立于颜色信息并仅只含亮度信息。另外两个通道编码颜色。

Lab颜色空间还具有以下特性: 1. 感知上均匀的色彩空间近似于我们如何感知色彩。1. 独立于设备(捕获或显示)。1. 广泛用于Adobe Photoshop。1. 通过复数变换方程与RGB颜色空间相关。 OpenCV中读取图像,转换为Lab空间图像结果如下图所示:

  • 从图中可以清楚地看出,光照的变化主要影响l分量。1. 包含颜色信息的a和b分量,在光照的变化下没有经历大的变化。1. 绿色,橙色和红色(它们是a通道的主要颜色)的相应值在b通道中没有变化,同样地,蓝色和黄色(它们是b通道的主要颜色)在a通道中没有变化。 ##

1.3  YCrCb颜色空间

YCrCb颜色空间源自RGB颜色空间,并具有以下三个成分。

  • 通道Y:伽马校正后从RGB获得的亮度或亮度分量。
  • 通道Cr:Cr=R-Y(红色成分与亮度成分Y的距离)。
  • 通道Cb:Cb=B-Y(蓝色成分与亮度成分Y的距离)。

此颜色空间具有以下属性。 1. 将亮度和色度分量分成不同的通道。1. 主要用于电视传输的压缩(Cr和Cb组件)。1. 取决于设备。 YCrCb颜色空间中分成其通道的两个图像如下所示:

对于照度变化,可以针对强度和颜色分量对LAB进行类似的观察。与LAB相比,室外图像中红色和橙色之间的感知差异较小。白色在所有3个组件中发生了变化。

1.4 HSV颜色空间

HSV颜色空间具有以下三个成分:

H色调,S饱和度,V明度。

HSV最大的特点是它只使用一个通道来描述颜色(H),这使得指定颜色变得非常直观。但是HSV色彩取决于设备。

两个图像的H,S和V分量如下所示。

从下图可以看到

H分量在两个图像中非常相似,这表明即使在光照变化下颜色信息也是完整的。

两个图像中的S分量也非常相似。

V分量表示亮度,因此它会因照明变化而发生变化。

红色室外和室内图像的值之间存在巨大差异。这是因为H值是以角度表示红色表示起始角度。因此它可能会取角度 [300,360]和[0,60]之间的值。

2 如何使用这些颜色空间进行分割

现在我们已经了解了不同的颜色空间,让我们首先尝试使用它们来检测魔方中的绿色。

2.1 获取特定颜色的颜色值

找到每个颜色空间的绿色值的近似范围。通过获取每个像素的所有颜色空间的值,如下所示:

2.2 应用分段阈值

该部分就不叙述了,详情见参考,实际用处不大。只是应用inRange函数选择合适的阈值分割图像而已。在实际中,通过颜色分割图像一般效果很差。建议不要使用,了解下就行了。

到此这篇关于OpenCV实战之OpenCV中的颜色空间的文章就介绍到这了,更多相关OpenCV颜色空间内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv-python 读取图像并转换颜色空间实例

    我就废话不多说了,直接上代码吧! #-*- encoding:utf-8 -*- ''' python 绘制颜色直方图 ''' import cv2 import numpy as np from matplotlib import pyplot as plt def readImage(): #读取图片 B,G,R,返回一个ndarray类型 #cv2.IMREAD_COLOR # 以彩色模式读入 1 #cv2.IMREAD_GRAYSCALE # 以灰色模式读入 0 img = cv2.im

  • OpenCV基础HSV颜色空间*args与**kwargs滑动条传参问题

    目录 一.基础理论 1.Hue(色相) 2.Value(明度) 3.Saturation(饱和度) 二.hsv三通道及单通道效果 三.*args && **kwargs 四.滚动条控制h.s.v(min && max) 1.创建滚动条 2.回调函数 -- 阈值设置 3.回调函数 -- 感兴趣值 参考资料 一.基础理论 HSV:HSV是一种为了加快调色效率,且易于理解的概念. Hue:色相(具体的颜色) Saturation:饱和度.色彩纯净度 Value:明度 1.Hue(

  • opencv实现图像颜色空间转换

    opencv常用的样色空间包括RGB, HSV和YUV等.RGB颜色空间是基于三基色原理二形成的,常用于图像显示系统中:HSV描述的色度,饱和度,亮度这些表示颜色得方法,常用于描述色彩变化:YUV是通过亮度和色度来描述颜色,色度由UV通道组合而成. opencv提供cvtColor(inputArray src, outputArray dst, int code, int dstCn = 0) src是输入图像原,可以是8位CV_8U或者16位CV_16U无符号整形,或者单精度浮点数CV_32

  • opencv转换颜色空间更改图片背景

    本文实例为大家分享了opencv转换颜色空间更改图片背景的具体代码,供大家参考,具体内容如下 思路: 1.将BGR转换为HSV颜色空间 2.设置掩模 3.位运算 这里以更改摩托罗拉logo背景为例,图片在必应图片搜索得知,具体代码如下: import numpy as np import cv2 from imageio import imread import matplotlib.pyplot as plt def show(img,winname = "img"): cv2.na

  • OpenCV实战之OpenCV中的颜色空间

    目录 1 不同的色彩空间 1.1RGB颜色空间 1.2 Lab色彩空间 1.3  YCrCb颜色空间 1.4 HSV颜色空间 2 如何使用这些颜色空间进行分割 2.1 获取特定颜色的颜色值 2.2 应用分段阈值 在本教程中,我们将了解计算机视觉中常用的色彩空间,并将其用于基于颜色分割.我们还将用C ++和Python共享演示代码. 在进行色彩分割时很多项目没有考虑到不同光照条件的影响,会严重影响结果.在许多计算机视觉应用中遇到这个问题,涉及基于颜色的分割,如肤色检测,交通灯识别等.所以构建一个强

  • Python实战之OpenCV实现猫脸检测

    开发工具 Python版本:3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 简单地讲一讲Haar分类器,也就是Viola-Jones识别器. 详细的原理说明可参考相关文件中的两篇论文: Rapid Object Detection using a Boosted Cascade of Simple Features; Robust Real-Time Face Detection. (1

  • Python+Opencv实战之人脸追踪详解

    目录 前言 人脸追踪技术简介 使用基于 dlib DCF 的跟踪器进行人脸跟踪 使用基于 dlib DCF 的跟踪器进行对象跟踪 小结 前言 人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份.意图和情感:而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用.由于外观变化.遮挡.快速运动.运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性. 人脸追踪技术简介 基于判别相关滤波器 (d

  • Python OpenCV实战之与机器学习的碰撞

    目录 0. 前言 1. 机器学习简介 1.1 监督学习 1.2 无监督学习 1.3 半监督学习 2. K均值 (K-Means) 聚类 2.1 K-Means 聚类示例 3. K最近邻 3.1 K最近邻示例 4. 支持向量机 4.1 支持向量机示例 小结 0. 前言 机器学习是人工智能的子集,它为计算机以及其它具有计算能力的系统提供自动预测或决策的能力,诸如虚拟助理.车牌识别系统.智能推荐系统等机器学习应用程序给我们的日常生活带来了便捷的体验.机器学习的蓬勃发展,得益于以下三个关键因素:1) 海

  • Python+OpenCV实战之利用 K-Means 聚类进行色彩量化

    目录 前言 利用 K-Means 聚类进行色彩量化 完整代码 显示色彩量化后的色彩分布 前言 K-Means 聚类算法的目标是将 n 个样本划分(聚类)为 K 个簇,在博文<OpenCV与机器学习的碰撞>中,我们已经学习利用 OpenCV 提供了 cv2.kmeans() 函数实现 K-Means 聚类算法,该算法通过找到簇的中心并将输入样本分组到簇周围,同时通过简单的示例了解了 K-Means 算法的用法.在本文中,我们将学习如何利用 K-Means 聚类进行色彩量化,以减少图像中颜色数量.

  • 人脸识别实战之Opencv+SVM实现人脸识别

    目录 前言 项目结构 编码 训练人脸识别模型 识别图像中的人脸 摄像头识别人脸 前言 在本文中,您将学习如何使用 OpenCV 进行人脸识别.文章分三部分介绍: 第一,将首先执行人脸检测,使用深度学习从每个人脸中提取人脸量化为128位的向量. 第二, 在嵌入基础上使用支持向量机(SVM)训练人脸识别模型. 第三,最后使用 OpenCV 识别图像和视频流中的人脸. 项目结构 编码 新建face_embeddings.py脚本,写入如下代码: # import the necessary packa

  • C++ OpenCV实战之图像全景拼接

    目录 前言 一.OpenCV Stitcher 1.功能源码 2.效果 二.图像全景拼接 1.特征检测 2.计算单应性矩阵 3.透视变换 4.图像拼接 5.功能源码 6.效果 三.源码 总结 前言 本文将使用OpenCV C++ 进行图像全景拼接.目前使用OpenCV对两幅图像进行拼接大致可以分为两类. 一.使用OpenCV内置API Stitcher 进行拼接. 二.使用特征检测算法匹配两幅图中相似的点.计算变换矩阵.最后对其进行透视变换就可以了. 一.OpenCV Stitcher imag

  • OpenCV实战之基于Hu矩实现轮廓匹配

    目录 前言 一.查找轮廓 二.计算Hu矩 三.显示效果 四.源码 总结 前言 本文将使用OpenCV C++ 基于Hu矩进行轮廓匹配. 一.查找轮廓 原图 测试图 vector<vector<Point>>findContour(Mat Image) {     Mat gray;     cvtColor(Image, gray, COLOR_BGR2GRAY);     Mat thresh;     threshold(gray, thresh, 0, 255, THRESH

  • OpenCV实战之图像拼接的示例代码

    目录 背景 实现步骤 一.读取文件 二.单应性矩阵计算 三.图像拼接 总结 背景 图像拼接可以应用到手机中的全景拍摄,也就是将多张图片根据关联信息拼成一张图片: 实现步骤 1.读文件并缩放图片大小: 2.根据特征点和计算描述子,得到单应性矩阵: 3.根据单应性矩阵对图像进行变换,然后平移: 4.图像拼接并输出拼接后结果图: 一.读取文件 第一步实现读取两张图片并缩放到相同尺寸: 代码如下: img1 = cv2.imread('map1.png') img2 = cv2.imread('map2

  • C++ OpenCV实战之车道检测

    目录 前言 一.获取车道ROI区域 二.车道检测 1.灰度.阈值 2.获取非零像素点 3.绘制车道线 总结 前言 本文将使用OpenCV C++ 进行车道检测. 一.获取车道ROI区域 原图如图所示. 使用下面代码段获取ROI区域.该ROI区域点集根据图像特征自己设定.通过fillPoly填充ROI区域,最终通过copyTo在原图中扣出ROI. void GetROI(Mat src, Mat &image) {     Mat mask = Mat::zeros(src.size(), src

随机推荐