前言:

本专栏主要结合OpenCV4(C++版本),来实现一些基本的图像处理操作、经典的机器学习算法(比如K-Means、KNN、SVM、决策树、贝叶斯分类器等),以及常用的深度学习算法。

系列文章:

  • OpenCV4机器学习(一):OpenCV4+VS2017环境搭建与配置
  • OpenCV4机器学习(二):图像的读取、显示与存储

相关推荐:

大家如果对 OpenCV-Python 感兴趣,可以前往优质博主【我是小白呀】的【OpenCV专栏】学习:

  • 【OpenCV】 简介 携手走进 OpenCV 的世界

文章目录

  • 一、颜色空间
  • 二、RGB颜色空间
  • 三、HSI颜色空间
  • 四、HSV颜色空间
  • 五、HSL颜色空间
  • 六、Lab颜色空间
  • 七、灰度颜色空间
  • 八、颜色空间转换实战

一、颜色空间

颜色空间又称彩色模型,再数字图像处理中:

  • RGB 颜色空间最常用的是面向硬件的颜色空间,该空间经常用于屏幕显示和视频输出。
  • HSI(色调、饱和度、强度)空间,是一种更符合人描述和解释颜色的一种模型。它还有一个优点:可以解除图像中的颜色和灰度信息的联系,使其更适合某些灰度处理技术。
  • HSV(色调、饱和度、亮度)空间,不适合显示器系统,但是更符合人眼的视觉特性,因此通常会将颜色从RGB空间域转换到HSV颜色空间进行处理,然后在换回RGB域进行显示;
  • HSL(色调、饱和度、亮度)空间,与HSV类似,只不过把V:Value替换为了L:Lightness。这两种表示在用途上类似,但在方法上有区别。
  • Lab (亮度、颜色通道a、b)空间,弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。
  • CMY(青、洋红、黄)空间和CMYK(青、洋红、黄、黑)空间,是针对彩色打印机的。

二、RGB颜色空间

对图像处理而言,RGB是最为重要和常见的颜色模型,它建立在笛卡尔坐标系中,以红、绿、蓝三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,俗称三基色模式。RGB颜色模式下的颜色非常接近 大自然的颜色,故又称为自然色彩模式。

RGB颜色空间是用一个单位长度的立方体来表示颜色的,黑蓝绿青红紫黄白8种常见颜色分别位居立方体的8个顶点,通常将黑色置于三维直角坐标系的原点,红绿蓝分别置于3根坐标轴上,整个立方体放在第1卦限内。如下图所示。而其中的青色与红色、紫色与绿色、黄色与蓝色是互补色。各参数的取值范围是:R:0-255;G:0-255;B:0-255。

参数值也称为三色系数或基色系数或颜色值,除以255后归一到0-1之间,但不是无穷多个而是有限多个值。由于每个灰度级都定为256,所以,红绿蓝分量全部组合起来共可表示256=2=16777216种不同的颜色。它比人眼能分辨的颜色种数多得多。因此,虽然自然界中的颜色非常多,但用RGB颜色空间来近似表达自然界中的颜色是完全够用了。


需要注意的是:OpenCV默认的RGB彩色空间的通道顺序为BGR,即蓝色、绿色和红色。例如:(255,0,0)表示蓝色,(0,255,0)表示绿色。

三、HSI颜色空间

HSI(色调、饱和度和亮度)空间可以从彩色图像中消除亮度分量的影响。因此,HIS空间对于开发基于彩色描述的图像处理算法来说是一个理想的彩色空间。在一些基于深度学习的分类识别任务中,通常将原始图像转换成HSI空间来削弱光线变化的影响,增强算法的稳定性。

HSI颜色空间可以用以双锥体表示,数学模型如下图:

RGB空间中的任何一个点可以转换成HSI空间中的点,具体的转换公式如下:

四、HSV颜色空间

HSV颜色空间中,H是Hue(色度)的缩写,S是Saturation(饱和度)的缩写,V是Value(亮度)的缩写:

  • 色度通常用来从宏观上区分某一种颜色,例如:白、黄、青、绿、品红、红、蓝、黑等就是色度;
  • 饱和度指的是颜色的纯度,通常情况下,颜色越鲜艳,饱和度越高;颜色越暗淡,饱和度越低;
  • 亮度指的是颜色的明暗程度,颜色越亮,亮度越高;颜色越暗,亮度越低。

HSV颜色空间的数学模型可以用一个圆锥来表示,如下图所示:


如图所示,某一像素的H可以由该点与白色基准线所形成的圆心角表示,H的取值范围为[0,360];某一点的S可以由该点与所在圆面的圆心之间的距离表示,距离越大,饱和度越高,反之越低;某一点的V可以由该点所在圆面与圆锥顶部之间的距离表示,距离越大,亮度越高,反之则越低。

RGB到HSV的转换公式如下:

HSV颜色空间不适合显示器系统,但是更符合人眼的视觉特性,因此通常会将颜色从RGB空间域转换到HSV颜色空间进行处理,然后在换回RGB域进行显示。

五、HSL颜色空间

HSL(色调、饱和度、亮度)空间,与HSV类似,只不过把V:Value替换为了L:Lightness。这两种表示在用途上类似,但在方法上有区别。

HSV和HSL二者在数学上都是圆柱,但HSV在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心),HSL在概念上表示了一个双圆锥体和圆球体(白色在上顶点,黑色在下顶点,最大横切面的圆心是半程灰色)。注意尽管在HSL和HSV中“色调”指称相同的性质,它们的“饱和度”的定义是明显不同的。

RGB到HSL的转换公式如下:

六、Lab颜色空间

Lab颜色空间,弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。Lab颜色模型由三个要素组成:

  • 亮度L,反映光线强度;取值0~100;
  • 颜色通道a,a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);取值-128~127;
  • 颜色通道b,是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值);取值-128~127。

这样规定是根据人类的视觉原理,灵长类动物的视觉都有两条通道:红绿通道和蓝黄通道,大多数动物最多只有一条通道,如果有人缺失其中一条,就是我们所说的色盲。

Lab模式对于PS极为重要,它是PS从一种颜色模式转换到另一种颜色模式的内部转化方式,PS从一种颜色模式转换到另一种颜色模式时,总是先转换到Lab模式。Lab色域是所有颜色模式中最宽广的,它囊括了RGB和CMYK的色域。

七、灰度颜色空间

很多类型的图像都没有色彩信息,只有亮度信息,通常使用灰度图表示,例如红外图像。灰度空间也是视觉机器学习任务中最基本的颜色空间。RGB空间转换为灰度空间的公式如下:

Y = 0.299 × R + 0.587 × G + 0.114 × B Y = 0.299 \times R + 0.587 \times G + 0.114 \times B Y=0.299×R+0.587×G+0.114×B

灰度空间转换为RGB空间的公式如下:

R = Y , G = Y , B = Y R=Y, G=Y, B=Y R=Y,G=Y,B=Y

八、颜色空间转换实战

cvtColor函数将输入的源图从某个颜色空间转换至另一个颜色空间。OpenCV的默认颜色空间为BGR,因此对于一个标准的3字节彩色图,第一个字节为8bit蓝色分量,第二个字节是8bit绿色分量,第三个字节是8bit红色分量。

cvtColor函数定义如下:

void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0)

各参数含义:

  • src:输入图像,可以是8位无符号整型(CV_8U)、16位无符号整型(CV_16U)或单精度浮点型数据
  • dst:输出图像,与输入图像的类型、大小和位深度均相等
  • code:颜色空间转换码,指定颜色空间转换的类型
  • dstCn:目标图像的通道数。当dstCn=0时,通道数将根据code与源图通道数自动确定

指定颜色空间转换的类型,将原图转换到不同的颜色空间,代码如下所示:

#include <iostream>
#include<opencv.hpp>using namespace std;
using namespace cv;int main()
{Mat img = imread("D:\\VSProject\\OpenCV4\\chap02\\lena.jpg", 1);imshow("Original", img);//imwrite("Original", img);Mat img_gray,  img_hsv, img_hsl, img_lab, img_rgb;cvtColor(img, img_rgb, COLOR_BGR2RGB);   //BGR转RGBcvtColor(img, img_gray, COLOR_BGR2GRAY); //BGR转灰度图cvtColor(img, img_hsv, COLOR_BGR2HSV);   //BGR转HSVcvtColor(img, img_lab, COLOR_BGR2Lab);   //BGR转LabcvtColor(img, img_hsl, COLOR_BGR2HLS);   //BGR转HSLimshow("rgb", img_rgb);imshow("gray", img_gray);imshow("hsv", img_hsv);imshow("lab", img_lab);imshow("hsl", img_hsl);waitKey(0);return 0;
}

原图、RGB三通道图、灰度图如下所示:

HSV、HSL、Lab颜色空间下的图如下所示:


本专栏所有完整的代码将在我的GitHub仓库上更新,欢迎大家前往学习:

  • https://github.com/Keyird/OpenCV4-Machine-Learning

进入GitHub仓库,点击 star (红色箭头所示),第一时间获取干货:

最好的关系是互相成就,各位的「三连」就是【AI 菌】创作的最大动力,我们下期见!

OpenCV4机器学习(三):颜色空间(RGB、HSI、HSV、Lab、Gray)之间的转换相关推荐

  1. 2021-01-07 Python Opencv转换颜色空间 RGB转为HSV

    Python Opencv转换颜色空间 RGB转为HSV 举个例子,通过摄像头把视频中的蓝色区域凸显出来,剩余的颜色均为黑色 import numpy as npcap = cv2.VideoCapt ...

  2. 颜色空间RGB与HSV HSL 的转换

    一般的3D编程只需要使用RGB颜色空间就好了,但其实美术人员更多的是使用HSV(HSL),因为可以方便的调整饱和度和亮度. 有时候美术需要程序帮助调整饱和度来达到特定风格的渲染效果,这时候就需要转换颜 ...

  3. RGB CMYK HSV LAB

    颜色空间(彩色模型.色彩空间. 彩色系统etc)是对色彩的一种描述方式,定义有很多种,区别在于面向不同的应用背景. RGB.CMY.HSV.LAB几种颜色空间编码都是三位的 RGB RGB色彩模式是工 ...

  4. 彩色模型RGB,HSI,HSV,CMYK区分

    RGB颜色模型 1.加色模型--光,越加越亮 2.R:red 红,G:green 绿,B:blue 蓝 3.应用:显示系统,比如电视和计算机. 4.RGB是一种依赖于设备的颜色空间:不同设备对特定RG ...

  5. 【颜色空间】RGB、HSV、Lab、YUV颜色空间模型

      颜色通常用三个相对独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.而颜色可以由不同的角度,用三个一组的不同属性加以描述,就产生了不同的颜色空间.但被描述的颜色对象本 ...

  6. 已知三个用不同数制表示的整数_数制的概念与常用的数制之间的转换。大学生必看!...

    数制的概念与常用的数制之间如何实现转化呢 一.首先我们来看一下,数制和与它相关的基数.位权是什么? 1. 数制就是表示数值大小的各种计数体制,简单来说就像是1,2,3···之类的用来计数的,只不过有很 ...

  7. HSI, HSV,RGB,HSL,HSB,CMYK ,Ycc,XYZ,Lab,YUV空间的区别

    HSV颜色空间   HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所 ...

  8. 颜色空间模型(HSV\LAB\RGB\CMYK)

    通过Photoshop的拾色器,我们知道表征颜色的模型的不止一种,本文将系统并且详细讨论这四种模型(HSV.LAB.RGB和CMYK)之间的联系以及应用. 本文部分章节整合了多位优秀博主的博客(链接见 ...

  9. python中颜色空间直方图_OpenCV—python 颜色空间(RGB,HSV,Lab)与 颜色直方图

    一.图像分类的过程 image.png 图片必须经过标注 图片的类别为有限的集合,如{猫.狗.牛.马.狼} 每个类别的图片数量接近,如果不同类别图片的数量差异很大,训练出来的分类器容易倾向于图片数量多 ...

最新文章

  1. 【科普】数据中心“容灾”和“备份”的区别
  2. django项目学习之QQ登录
  3. [转载]如何决定要使用多少点来做FFT?(转载)
  4. 20多个Maven命令和选项(备忘单)
  5. STemWin5.22在STM32F103上的移植步骤
  6. Atitit 常见集合的操作 dsl表达式 选择器 多属性条件检索 ,排序等 目录 1. Ognl 集合操作 1 2. /bookmarksHtmlEverythingIndexPrj/src/Li
  7. java 省份城市_如何用Java输入一个省份,然后列出这个省份所有城市的名字?
  8. 我爱你 php代码怎么打,微信翻译代码我爱你怎么写?微信翻译表白代码介绍大全...
  9. Can DBC文件翻译
  10. echarts柱状图大小显示_百度Echarts入坑(柱状图正负显示)
  11. matlab 中 矩阵取平方,matlab中怎样计算一个矩阵中每个数的平方
  12. 如何让北京小车摇号中签更容易?
  13. 6款好用的在线思维导图工具推荐
  14. c语言编写一个找零程序,C语言找零程序求修改
  15. iOS13苹果登录的后台验证token(JAVA)
  16. 【问题解决】xlwings处理excel复制粘贴时数字自动变成科学计数法
  17. Vue之Axios AJAX封装
  18. DDoS攻击解决方案-云防护
  19. 手把手教你玩物联网(三)---对接onenet云端
  20. 2022年全球程序员收入报告出炉:字节跳动成国内唯一上榜公司

热门文章

  1. 佳明服务器又中断了,Garmin佳明多项服务中断 官方回应正在加速恢复
  2. CSS层叠样式表——元素背景和文本样式
  3. 怎么查笔记本是几月生产的
  4. 2020蓝桥杯国赛Java大学B组解题报告
  5. 思科模拟 实验十五:路由器的基本配置命令
  6. try catch中的catch里写什么
  7. 员工部门mysql面试题
  8. Day 5-6 阿里云手机验证码及登录代码
  9. DedeCMS 友情链接按分类网站类型调用的方法
  10. linux xia shan chu wenjian