本期将了解三种不同的颜色空间,RGB,HSV,GRAY。会使用OpenCV来读取三种颜色空间,并且操作不同空间的转换,观察不同颜色空间的特点。
完成本期内容,你可以:
-
了解RGB,HSV,GRAY三种颜色空间的定义
-
掌握读取图片到不同的颜色空间
-
掌握三种颜色空间的转换
-
掌握如何拆分、合并图像通道
若要运行案例代码,你需要有:
-
操作系统:Ubuntu 16 以上 或者 Windows10
-
工具软件:VScode 或者其他源码编辑器
-
硬件环境:无特殊要求
-
核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16
点击下载源码
RGB色彩空间
-
RGB色彩空间包含3个通道,R通道,G通道,B通道。
-
R 通道指的是红色(Red) 通道; G 通道指的是绿色通道; B 通道指的是蓝色(Blue) 通道, 并且每个色彩通道都在区间[ 0 , 25 5 ] 内进行取值。
-
图像在计算机中是以矩阵的形式保存的,对于RGB图像模式,一张图像保存了三个矩阵,每个矩阵用于表示其中的一种颜色。由于矩阵的顺序不同,会有RGB模式,RBG模式,BRG模式等。但无论是RGB模式,RBG模式,还是BRG模式,本质上都是一种模式,只不过颜色矩阵的存储顺序不同。
HSV色彩空间
-
HSV 色彩空间是基于色调、饱和度和亮度而言的。
-
色调(H)是指光的颜色,例如彩虹中的赤、橙、黄、绿、青、蓝、紫分别表示不同的色调,在OpenCV中, 色调在区间[ 0 , 180 ] 内取值。
-
饱和度(S) 是指色彩的深浅。在OpenCV 中, 饱和度在区间[ 0 , 255 ] 内取值。当饱和度为0 时,图像将变为灰度图像。
-
亮度(V) 是指光的明暗。与饱和度相同, 在OpenCV中, 亮度在区间[ 0 , 255 ]内取值。亮度值越大, 图像越亮; 当亮度值为0 时, 图像呈纯黑色。
GRAY色彩空间
-
GRAY 色彩空间通常指的是灰度图像, 灰度图像是一种每个像素都是从黑到白, 被处理为256 个灰度级别的单色图像。
-
这256 个灰度级别分别用区间[ 0 , 255 ] 中的数值表示。其中,”0 ”表示纯黑色,“ 255 ” 表示纯白色, 0 ~255 之间的数值表示不同亮度( 即色彩的深浅程度) 的深灰色或者浅灰色。
不同色彩空间的转换
OpenCV中提供的不同空间转换的函数是 cv2.cvtColor( )。
函数原型: dst = cv2.cvtColor(src, code);
dst 为转换后的图像。
参数描述如下:
参数 | 描述 |
---|---|
src | 转换前的初始图像 |
code | 色彩空间转换码 |
色彩空间转换码,如下:
色彩空间转换码 | 含义 |
---|---|
cv2.COLOR_BGR2GRAY | 从BGR色彩空间转换到GRAY色彩空间 |
cv2.COLOR_RGB2GRAY | 从RGB色彩空间转换到GRAY色彩空间 |
cv2.COLOR_BGR2HSV | 从BGR色彩空间转换到HSV色彩空间 |
cv2.COLOR_RGB2HSV | 从RGB色彩空间转换到HSV色彩空间 |
cv2.COLOR_BGR2BGRA | 从BGR色彩空间转换到BGRA色彩空间 |
拆分图像通道
OpenCV 中提供的用于拆分图像通道的函数是 cv2.split()。
函数原型: b,g,r = cv2.split(bgr_image) ; h,s,v = cv2.split(hsv_image) .
b,g,r为查分后对应的B G R通道;h,s,v为拆分后的H S V通道。
参数描述如下:
参数 | 描述 |
---|---|
bgr_image | 一幅BGR图像 |
hsv_image | 一幅HSV图像 |
合并图像通道
OpenCV 中提供的用于合并图像通道的函数是 cv2.merge()。
函数原型: rgb = cv2.merge([r,g,b]) ; hsv = cv2.merge([h,s,v]) .
rgb 为按照 R -> G -> B 的顺序合并通道得到的图像;hsv 为按照 H -> S -> V 的顺序合并通道得到的图像。
参数描述如下:
参数 | 描述 |
---|---|
[r,g,b] | [R通道图像,G通道图像,B通道图像] |
[h,s,v] | [H通道图像,S通道图像,V通道图像] |
具体步骤
1. 创建项目结构
创建项目名为图像在不同色彩空间间的转换
,项目根目录下新建code
文件夹储存代码,新建dataset
文件夹储存数据,项目结构如下:
图像在不同色彩空间间的转换 # 项目名称
├── code # 储存代码文件
├── dataset # 储存数据文件
注:如项目结构已存在,无需再创建。
2. 将图像由BGR色彩空间转换到HSV色彩空间
- 在
code
文件夹下创建bgr2hsv.py
文件; - 读取
dataset
文件夹下的daisy.png
图片,并进行展示,标题为daisy_bgr
; - 将图片由BGR色彩空间转换到HSV色彩空间,并进行展示,标题为
daisy_hsv
- 无限等待用户输入按键,按下按键后销毁所有窗口。
代码实现
# 导入OpenCV
import cv2
# 读取图像
img = cv2.imread('../dataset/daisy.png')
# 展示图像
cv2.imshow("daisy_bgr",img)
# 将图片由BGR色彩空间转换到HSV色彩空间
hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 展示图像
cv2.imshow("daisy_hsv",hsv_img)
# 等待用户输入
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
3. 将图像由BGR色彩空间转换到GRAY色彩空间
- 在
code
文件夹下创建bgr2gray.py
文件; - 读取
dataset
文件夹下的daisy.png
图片,并进行展示,标题为daisy_bgr
; - 将图片由BGR色彩空间转换到GRAY色彩空间,并进行展示,标题为
daisy_gray
- 无限等待用户输入按键,按下按键后销毁所有窗口。
代码实现
# 导入OpenCV
import cv2
# 读取图像
img = cv2.imread('../dataset/daisy.png')
# 展示图像
cv2.imshow("daisy_bgr",img)
# 将图片由BGR色彩空间转换到gray色彩空间
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 展示图像
cv2.imshow("daisy_gray",gray_img)
# 等待用户输入
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
4. 拆分图像通道
- 在
code
文件夹下创建img_split.py
文件; - 读取
dataset
文件夹下的daisy.png
图片; - 将图片拆分为3个通道,并以此展示3个通道的图片;
- 无限等待用户输入按键,按下按键后销毁所有窗口。
- 无限等待用户输入按键,按下按键后销毁所有窗口。
代码实现
# 导入OpenCV
import cv2
# 读取图像
img = cv2.imread('../dataset/daisy.png')
# 将图片拆分为3个通道
b,g,r = cv2.split(img)
# 展示图像
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
# 等待用户输入
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
OpenCV的 RGB,HSV,GRAY三种颜色空间的操作非常简单,在实际应用的过程中,需要我们知道,每种色彩空间的含义和用途,才能够正确处理图像,得到我们想要的效果。
点击下载源码