(四)使用OpenCV实现图像彩色模型转换

全文介绍部分引自《数字图像处理》第六章

1.彩色基础

彩色光在电磁波中的波长范围是400-700nm。人眼中的锥状体负责色觉的感知,实验发现,人眼中约有600万~700万个锥状体,它们分为3个主要的感知类别。这些类别分别是红色、绿色和蓝色。锥状体中约65%对红光敏感,33%对绿光敏感,只有约2%对蓝光敏感。人眼中看到的颜色正是红绿蓝三原色的不同比例的组合。为了标准化,1931年国际照明委员会(CIE)规定了三原色的波长,红光:700nm,绿光:546.1nm,蓝光:435.8nm。

颜色的构成通常看作三原色的相加减组合,而为了更好适应人们对颜色的描述,通常使用 亮度(lightness)、色调(hue)和饱和度(saturation) 来区别不同颜色的特性。亮度体现的是发光强度的消色概念。色调是混合光波中与主波长相关的属性,表示被观察者感知的主导色。故在说一个物体是红色,绿色时,说的就是色调。饱和度指的是颜色的相对纯度,或与一种色调混合的白光量。纯色光谱是完全饱和的。饱和度与所加的白光量成反比。

2.彩色模型

彩色模型又称彩色空间,彩色系统,其目的是以某种标准的方式来方便的规定颜色。彩色模型本质上规定:1)坐标系,2)坐标系中的子空间模型内的每种颜色都可以使用子空间中包含的一个点来表示。

今天我们使用的大多数彩色模型要么是面向硬件的(如彩色显示器,打印机),要么是面向应用的(如为动画创建的彩图)。就数字图像处理而言,最常用用的面向硬件的模型有

  • 针对彩色显示器的和摄像机开发的RGB模型
  • 针对彩色打印机开发的(青色/深红色/黄色)CMY模型和CMYK模型(青色/深红色/黄色/黑色)
  • 针对人们描述解释颜色开发的HSI模型(色度/饱和度/亮度)

2.1RGB模型

在RGB空间中表示,表示每个像素数所用的比特数称为像素深度。一幅RGB图像,每个通道的像素点使用8比特来表示,则该图像的像素深度为3x8=24,则每个像素点能表示的所有颜色有(28)3=16777216(2^8)^3=16777216(28)3=16777216种。对于数字图像,RGB彩色立方体中的值域已被标定为图像中比特数表示的数字,如对于8比特图像,其颜色值域为[0-255]。

2.2CMY和CMYK模型

青深红黄(CMY)是二次色,正是颜料的原色。大多数在纸上淀积颜色的设备,如彩色打印机和复印机,要求输入CMY数据,或在内部进行CMY的转换。CMYRGB的转换关系。
[CMY]=1−[RGB]\begin{bmatrix} C\\ M\\ Y \end{bmatrix}=1-\begin{bmatrix} R\\ G\\ B \end{bmatrix}⎣⎡​CMY​⎦⎤​=1−⎣⎡​RGB​⎦⎤​

理论上等量的颜料原色应产生黑色。实际中,CMY油墨通常不是纯色的,组合这些颜料来印刷黑色时,反而会产生模糊的棕色。故为产生真正的黑色,通常会加入第四种颜色黑色,即CMYK彩色模型。CMYCMYK的转换参考1

2.3HSI模型

RGB\CMY\CMYK彩色模型非常适合硬件的实现,但不能很好的描述人类实际解释的颜色。⼈类观察⼀个彩⾊物体, ⼀般⽤⾊相(hue)、饱和度(saturation)、亮度(brightness)来描述它。简称为HSB模型,与HSB等同的是HSV模型,其中VValue。此外还有HSIHSL模型,分别是IntensityLightnessHSIHSL模型等同。HSIHSB有些微差别。

对于上图中的RGB彩色立方体,转换为以(0,0,0)为坐标原点,以(1,1,1)为顶点的模型,如下:
。则亮度即彩色点所在垂直于强度轴平面的交点处与(0,0,0)的距离。饱和度即彩色中混合的白光量,即彩色点到强度轴的垂直距离。亮度轴上的饱和度为零。色调即以红色点开始,逆时针方向旋转的角度θ\thetaθ,反映的是颜色的主色。如图是上图彩色立方体的俯视图,θ\thetaθ即以红色为起始点逆时针转动的角度。

RGBHSI彩色模型间的转换关系参考1。

2.4其他

其他常用的色彩空间还有YUV、Luv、Lab和Bayer等

3.使用OpenCV进行图像色彩空间变换 cvtColor

以调整图像亮度为例。cvtColor的详细使用介绍参考2。

#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>int main(int argv, char **argc)
{cv::Mat image = cv::imread("imgs/hand.png");cv::Mat src;cv::cvtColor(image, src, cv::COLOR_BGR2HSV);int value = 50;int lim = 255 - value;int cn = src.channels();uint8_t* pixelPtr = (uint8_t*)src.data;for(size_t i = 0; i < src.rows; i++) {for(size_t j=0; j < src.cols; j++){if(pixelPtr[(i*src.cols+j)*cn + 2] > lim){pixelPtr[(i*src.cols+j)*cn + 2] = 255;}else{pixelPtr[(i*src.cols+j)*cn + 2] += value;}}}cv::cvtColor(src, src, cv::COLOR_HSV2BGR);std::cout << "src channles:" << src.channels() << std::endl;cv::imwrite("hsv.png", src);return 0;
}

调整前:

调整后:

参考
[1]https://book.douban.com/subject/6434627//
[2]https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html

(四)使用OpenCV实现图像彩色模型转换相关推荐

  1. OpenCV图像颜色模型转换:cvtColor函数的使用

    Opencv提供了不同颜色模型之间转换的函数cvtColor,可以很容易的将一种颜色模型转换为另一种颜色模型. 原型 CV_EXPORTS_W void cvtColor( InputArray sr ...

  2. 解析常用的图像彩色模型

    原文链接:https://blog.csdn.net/u012507022/article/details/51523385 颜色模型(颜色空间)就是描述用一组数值来描述颜色的数学模型.在彩色图像处理 ...

  3. 四、OpenCV颜色空间——HSV颜色模型

    教程汇总:python基础入门系列 该章节主要介绍两种颜色空间RGB与HSV,HSV将作为我们主要使用的颜色空间. RGB: 在计算机体系中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三 ...

  4. Python 计算机视觉(四)—— OpenCV进行图像算数与逻辑运算

    目录 1. 图像加法运算 (1)随机生成灰度图像 (2)读取原始图像 (3)两图像相加 (4)图像像素点加常数 2. 图像减法运算 (1)减小亮度 (2)还原添加灰度图像的图像 3. 图像与运算 4. ...

  5. 使用Python,OpenCV进行图像平移转换

    使用Python,OpenCV进行图像平移转换 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何使用Python,OpenCV对图像进行平移转换.平移是图像沿x轴和y轴的移动.使用平移, ...

  6. 9.2【彩色模型】-----基于Opencv实现-----把一幅RGB图转为CMY图

    (一)CMY模型 CMY(Cyan,Magenta,Yellow)模型是采用青,品红,黄色3种基本原色按一定比例合成颜色的方法,由于色彩的显示不是直接来自于光线的色彩,而是光线被物理吸收掉一部分之后反 ...

  7. 相机与图像--小孔成像模型与坐标系--坐标系转换

    利用图像序列进行三维重建的过程,相当于把一张张由很多像素组成的二维图像还原到三维空间中的一个过程.通过了解整个投影的过程,就可以很容易理解如何利用图像进行三维重建,以及三维重建中的关键步骤是什么.该小 ...

  8. 《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之通过OpenCV进行人脸口罩模型训练并进行口罩检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  9. OpenCV4使用applyColorMap()函数,可以将灰度图或彩色图转换成自定义的彩色图,或opencv提供的20多种色彩值

    文章目录 1.applyColorMap()函数的使用: (1)函数原型: void applyColorMap(InputArray src, OutputArray dst, int colorm ...

最新文章

  1. HTML5 body设置全屏背景图片 如何让body的背景图片自适应整个屏----实战经验
  2. 项目管理理论与实践(4)——UML应用(上)
  3. NR 5G SDAP业务数据适配协议
  4. linux安装 mysql-5.7.25_Linux 系统下安装 mysql5.7.25(glibc版)
  5. python【蓝桥杯vip练习题库】BASIC-23芯片测试(统计)
  6. NodeJS:将指定文件夹内所有文件重命名为英文
  7. 进程间通信(5) 命名管道2 不同机器通信
  8. django filter查询多选_Django:使用filter的pk进行多值查询操作
  9. [HAOI2016]字符合并(ing)
  10. java gc full gc_Java中full gc什么意思?
  11. tt服务器系统,tt服务器
  12. Java中的锁(转)
  13. Google 再被罚!
  14. Go 性能优化技巧 7/10
  15. 更换浏览器标题栏图标
  16. 借助高德LBS开放平台打造属于国人的LBS+AR游戏
  17. 同步,异步,直流电机原理
  18. 跳转第三方App或网页进行导航
  19. PCB_元件模型创建
  20. Python使用pyinstaller打包成exe文件,并支持传入外部参(已解决打包后文件大的情况)

热门文章

  1. 二叉树性质 四种遍历方式
  2. 手动绘制方向梯度直方图(HOG)
  3. c#执行cmd命令并获取返回结果字符串
  4. matlab2c使用c++实现matlab函数系列教程-deconv函数
  5. RS232通讯数据解析C#
  6. Docker部署微服务应用的架构设计
  7. [SQL]LeetCode180. 连续出现的数字 | Consecutive Numbers
  8. js中arguments的用法
  9. python SMTP attachment
  10. hdu4734 F(x)