这篇随笔介绍使用OpenCV进行图像处理的第三章 色彩空间。

3  色彩空间

之前的介绍,大多是基于BGR色彩空间进行的,但针对不同的实际情况,研究人员提出了许多色彩空间,它们都有各自擅长处理的领域。所以,我们需要学习如何对不同色彩空间的图像进行转换映射。

3.1  色彩空间及类型转换函数

(一)色彩空间

常见的色彩空间有GRAY色彩空间、HSV色彩空间、YCrCb色彩空间、CMYK色彩空间、XYZ色彩空间、YUV色彩空间等(颜色模型)。

我们只展示出GRAY灰度模型转换为RGB颜色模型的方式:

Gray=0.299R+0.587G+0.114B

以后需要用到其他哪种颜色模型之间的转化,百度即可(手动狗头)

(二)类型转换函数

OpenCV提供了不同色彩空间进行转化的函数语法,如下:

  1. dst=cv2.cvtColor(src,code [, dstCn])

其中,dst表示输出图像,src表示输入图像,code是色彩空间转换代码(枚举值太多,百度可得),dstCn是图像的通道数(不写默认为自动获得)。

3.2  类型转换实例

本节通过一个实例的代码,展示cv2.cvtColor()函数的用法及功能。

实例:将BGR模式转换为灰度图像,再将灰度图像转换为RGB模式。

  1. 1 #将BGR模式转换为灰度图像,再将灰度图像转换为RGB模式
  2. 2 import cv2
  3. 3 import numpy as np
  4. 4 bgr=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8) #生成2×4×3的BGR图像
  5. 5 gray=cv2.cvtColor(bgr,cv2.COLOR_BGR2GRAY) #BGR图像转换为灰度图像
  6. 6 rgb=cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB) #灰度图像转换为RGB图像
  7. 7 print('bgr=\n',bgr)
  8. 8 print('gray=\n',gray)
  9. 9 print('rgb=\n',rgb)

3.3  HSV色彩空间应用

实际中,我们经常使用HSV色彩空间来感知色调、饱和度、亮度。

色调(Hue):取值范围是[0,360]

饱和度(Saturation):取值范围是[0,1]

亮度(Value):取值范围是[0,1]

下面我们通过两个举例,来学习HSV色彩空间的代码及功能。

举例一:在OpenCV中测试BGR图像的不同颜色变换到HSV色彩空间后,各个分量的值。

  1. 1 #在OpenCV中测试BGR图像的不同颜色变换到HSV色彩空间后,各个分量的值
  2. 2 import cv2
  3. 3 import numpy as np
  4. 4 #------------测试OpenCV中蓝色分量的值-----------
  5. 5 imgBlue=np.zeros([1,1,3],dtype=np.uint8)
  6. 6 imgBlue[0,0,0]=255 #0号通道代表蓝色
  7. 7 Blue=imgBlue
  8. 8 BlueHSV=cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV) #BGR模式的蓝色变换到HSV色彩空间
  9. 9 print('Blue=\n',Blue)
  10. 10 print('BlueHSV=\n',BlueHSV)
  11. 11 #------------测试OpenCV中绿色分量的值-----------
  12. 12 imgGreen=np.zeros([1,1,3],dtype=np.uint8)
  13. 13 imgGreen[0,0,1]=255 #1号通道代表绿色
  14. 14 Green=imgGreen
  15. 15 GreenHSV=cv2.cvtColor(Green,cv2.COLOR_BGR2HSV) #BGR模式的绿色变换到HSV色彩空间
  16. 16 print('Green=\n',Green)
  17. 17 print('GreenHSV=\n',GreenHSV)
  18. 18 #------------测试OpenCV中红色分量的值-----------
  19. 19 imgRed=np.zeros([1,1,3],dtype=np.uint8)
  20. 20 imgRed[0,0,2]=255 #2号通道代表红色
  21. 21 Red=imgRed
  22. 22 RedHSV=cv2.cvtColor(Red,cv2.COLOR_BGR2HSV) #BGR模式的红色变换到HSV色彩空间
  23. 23 print('Red=\n',Red)
  24. 24 print('RedHSV=\n',RedHSV)

举例二:调整HSV色彩空间内V通道的值,观察其处理结果。

  1. 1 #调整HSV色彩空间内V通道的值,观察其处理结果,以实现艺术效果
  2. 2 import cv2
  3. 3 img=cv2.imread('E:/python_opencv/tupian.jpg')
  4. 4 hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #BGR模式转换为HSV模式
  5. 5 h,s,v=cv2.split(hsv) #通道拆分
  6. 6 v[:,:]=255 #V通道置为255
  7. 7 newHSV=cv2.merge([h,s,v]) #通道合并为新的HSV图片
  8. 8 art=cv2.cvtColor(newHSV,cv2.COLOR_HSV2BGR) #HSV模式转换为BGR模式
  9. 9 cv2.imshow('img',img)
  10. 10 cv2.imshow('art',art)
  11. 11 cv2.waitKey()
  12. 12 cv2.destroyAllWindows()

3.4  Alpha通道

在RGB色彩空间的基础上,还可以加一个A通道,叫做Alpha通道,此时原图像类型转变为RGBA模式,例如常见的PNG类型图像就是RGBA色彩空间的。Alpha通道的取值范围是[0,1]或[0,255],表示从透明到不透明。

下面是一个举例,展示Alpha通道的代码和分析:

  1. 1 #编写程序,分析alpha通道的值
  2. 2 import cv2
  3. 3 import numpy as np
  4. 4 img=np.random.randint(0,256,size=[2,3,3],dtype=np.uint8) #生成2×3×3的BGR图像
  5. 5 bgra=cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
  6. 6 print('img=\n',img)
  7. 7 print('bgra=\n',bgra)
  8. 8 b,g,r,a=cv2.split(bgra)
  9. 9 print('a=\n',a)
  10. 10 a[:,:]=125
  11. 11 bgra=cv2.merge([b,g,r,a])
  12. 12 print('bgra=\n',bgra)

这次内容就分享到这里了,下次继续更新第4章图像的几何变换,希望与各位老师和小伙伴们交流学习~

【图像处理】使用OpenCV+Python进行图像处理入门教程(三)色彩空间的更多相关文章

  1. PySide——Python图形化界面入门教程(三)

    PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  2. Python开发的入门教程(一)-数据类型、变量

    介绍 Python第一门课程,是Python开发的入门教程,将介绍Python语言的特点和适用范围,Python基本的数据类型,条件判断和循环,函数,以及Python特有的切片和列表生成式. Pyth ...

  3. 无废话ExtJs 入门教程三[窗体:Window组件]

    无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...

  4. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

  5. RabbitMQ入门教程(三):Hello World

    原文:RabbitMQ入门教程(三):Hello World 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

  6. JasperReports入门教程(三):Paramters,Fields和Detail基本组件介绍

    JasperReports入门教程(三):Paramter,Field和Detail基本组件介绍 前言 前两篇博客带领大家进行了入门,做出了第一个例子.也解决了中文打印的问题.大家跟着例子也做出了de ...

  7. python之scrapy入门教程

    看这篇文章的人,我假设你们都已经学会了python(派森),然后下面的知识都是python的扩展(框架). 在这篇入门教程中,我们假定你已经安装了Scrapy.如果你还没有安装,那么请参考安装指南. ...

  8. Python运算符 - Python零基础入门教程

    目录 一.算术运算符 二.赋值运算符 三.比较运算符 四.运算符的优先等级 五.重点总结 六.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...

  9. Python break/continue - Python零基础入门教程

    目录 一.break 二.continue 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python wh ...

  10. Python for循环 - Python零基础入门教程

    目录 一.for 循环语法 二.for 循环实战 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python ...

随机推荐

  1. Codeforces Round #650 (Div. 3) A. Short Substrings

    题目链接:https://codeforces.com/contest/1367/problem/A 题意 给出一个字符串 $t$,找出原字符串 $s$,$t$ 由 $s$ 从左至右的所有长为 $2$ ...

  2. Berry Jam (前缀和)cf教育场

    距离上一篇博客又2个月了 寻思着该除除草了 教育场是真的好难 可能是因为我还是只菜鸡 哭唧唧 先说下题意:有2*n罐果酱,草莓和蓝莓,梯子在中间从梯子那开始往两边吃(可以一会左一会右),问最少吃多少果 ...

  3. c语言实现--顺序表操作

    经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连 ...

  4. hdu5391 Zball in Tina Town

    Problem Description Tina Town is a friendly place. People there care about each other. Tina has a ba ...

  5. Educational Codeforces Round 94 (Rated for Div. 2) C. Binary String Reconstruction (构造)

    题意:给你一个字符串\(s\),原字符串为\(w\),如果\(i>x\)且\(w_{i-x}=1\),那么\(s_{i}=1\),如果\(i+x\le n\)且\(w_{i+x}=1\),那么\ ...

  6. &#128218;C#/.NET/.NET Core推荐学习书籍(升职加薪,你值得拥有)

    前言: 作为一名程序员,我们无时无刻都要考虑着如何通过不断地学习来提升自己的核心竞争力.古人有云:"书中自有黄金屋,书中只有颜如玉",说明了书籍的重要性,没错工作多年来,发现身边那 ...

  7. SPI/QSPI通信协议详解和应用

    SPi是高速全双工的串行总线,通常应用在通讯速率较高的场合. SS:从设备选择信号线,也称片选信号线 每个从设备都有一个独立的SS信号线,信号线独占主机的一个引脚,及有多少个从设备就有多少个片选信号线 ...

  8. K8S(09)交付实战-通过流水线构建dubbo服务

    k8s交付实战-流水线构建dubbo服务 目录 k8s交付实战-流水线构建dubbo服务 1 jenkins流水线准备工作 1.1 参数构建要点 1.2 创建流水线 1.2.1 创建流水线 1.2.2 ...

  9. 进程控制——fork-and-exec、system、wait

    forc-and-exec流程 父进程与子进程之间的关系十分复杂,最大的复杂点在于进程间相互调用.Linux下这一流程称为fork-and-exec.父进程通过fork的方式产生一个一模一样的子进程, ...

  10. Vue dynamic component All In One

    Vue dynamic component All In One Vue 动态组件 vue 2.x https://vuejs.org/v2/guide/components-dynamic-asyn ...