华纳在线开户——SKSKFC
0.本节涉及的opencv新函数
颜色空间转化函数 cv.cvtColor()
1.彩色的形成
“Indeed rays,properly expressed,are not colored”——牛顿。
光线为不同频率的电磁波,人的视觉能感受到光的刺激,并且将不同频率的电磁波感知为不同颜色,所以,彩色仅存在于人的眼睛和大脑中,物理世界分布的是带有不同辐射能量的光线。
2.彩色空间
彩色模型建立在彩色空间之上,彩色模型和彩色空间的概念不做分别。
根据原理可以分为4类,根据应用可以分为2类
根据原理模型原理举例比色模型/色度模型基于对光谱反射的物理测量为颜色"id",颜色最精确的表达生理学模型基于人类视网膜中存在的3种基本颜色感知锥细胞RGB心理物理模型/精神物理学模型基于人类对颜色的感知HSI,HCV,L*a*b*对立模型基于感知实验HSB根据应用模型应用举例面向硬设备显示器,打印机RGB,CMY,CMYK面向视觉动画,图像处理HSI,HSB,L*a*b*
3.为什么需要选择合适的彩色空间
人对彩色的感知与刺激视网膜的电磁辐射的谱能量分布,人的神经心里学,人的生理行为等有关,感知彩色是一个很复杂的过程,应用也存在多样性。CIE定义了若干彩色模型,每个模型都只有特定的适用情况,
没有一种通用模型满足所有情况,由彩色原理和彩色应用等去选择合适的彩色模型能统一处理问题的维度。
4.如何选择合适的彩色空间
了解自己的需求并寻找对应特性的彩色空间。例如,RGB模型特别适合在图像采集输入和图像输出显示等场合应用,但与人类视觉感知有一定区别,就是当我们看到一幅图像的时候并不能感知到他的红绿蓝各有多少分量,这个时候HSV模型就比较适配,H代表色调,S代表饱和度,V代表强度,这样建立的模型与人的感知高度适配。
在HSV模式下分析图像,取到图像的V值,并减小100个像素到v1,对比观察,能发现,人眼就能明显感知到亮度的变化。
def
main():
# 读取图像
src
=
cv.imread(
"../imgs/opencv.png"
)
# 转换HSV空间
hsv
=
cv.cvtColor(src, cv.COLOR_BGR2HSV)
# 分离通道
h, s, v
=
cv.split(hsv)
cv.namedWindow(
"v"
, cv.WINDOW_NORMAL)
cv.imshow(
"v"
, v)
# 减小亮度
v1
=
v
-
30
cv.namedWindow(
"v1"
, cv.WINDOW_NORMAL)
cv.imshow(
"v1"
, v1)
cv.waitKey(
0
)
cv.destroyAllWindows()
5.常用的彩色空间 RGB
(出自图像工程第4版,张毓晋,清华大学出版社)
基于 人体锥细胞,为一种与人的视觉系统结构密切相连的模型
视网膜中三种不同的感受彩色的锥细胞的波长响应曲线SML与三原色RGB基本对应
RGB模型的建立在笛卡尔坐标系统中
原点为黑色,离原点最远的顶点为白色,这两点连线上为深浅不同的灰色
CMY
三色光两两叠加产生三补色CMY,C为蓝绿(绿+蓝),M为品红(红+蓝),Y为黄(红+绿)
一般用于出版社打印,图像处理不常用
HSI
HSI与人类感知相对应,被称为面向用户的彩色模型
用色调(Hue)、色饱和度(Saturation)和亮度(Intensity)来描述色彩
独立于显示设备
HSI的优点:
强度分量与图像的彩色信息无关,是独立的, 也就是强度/亮度分量的变换并不改变图像的色调和饱和度。
H与S独立并且适配人的感官,使得HSI模型非常适合基于人的视觉系统对彩色感知特性进行处理分析的图像算法。
HSI的缺点:
并不是均匀彩色空间模型——人所感觉到的两点的色彩区别程度与色彩空间两点的欧氏距离相对应。
为了更直观的感受HSI彩色模型对人类感官的适配,代码拆分了同一幅图的RGB分量和HSV分量。
颜色越深则该分量值的占比越大。可以看出,HSI的三幅图看起来很不相同,表示,人眼能感觉到的HSI三个分量的区别要比RGB三个分量的区别要大
。
L*a*b*
从人的直观感受来看,彩色模型对彩色的描述应该与人对彩色的感知越同步越好,
L\*a\*b\*是一个均匀彩色空间
,即,人所感觉到的两点的色彩区别程度与此空间中两点的欧氏距离相对应也是一个面向人类视觉的彩色空间,与设备无关,适合接近自然光照明的应用场合
6.变换彩色空间数学公式
每个工具包工具定义的分量范围不同,像色调H可以是0-180也可以是0-360,在数学上,可以互相转换。所以opencv在处理时,对于8位和16位图像,R、 G 和 B 被转换为浮点格式,并按比例缩放归一化到0-1。
部分转换公式如下:
RGB2Gray
RGB2CIE XYZ
RGB2HSV
7.opencv变换彩色空间代码+注释+效果
opencv的cvtColor函数实现色彩空间的转换,提供了150种
颜色空间的转换方式,只需要在cvtColor
函数的flag
位填写对应的转换标识即可。转换标识获取如下。
import
CV2 as cv
flags
=
[i
for
i
in
dir
(cv)
if
i.startswith(
'COLOR_'
)]
#这里会输出150种flag,他们是opencv定义的彩色空间转换flag,是cv.cvtColor(input_image, flag)的第二个参数值。
print
( flags )
可以自己通过上面的代码获取,或者直接查询官方文档
这里介绍两种转换代码和效果案例,分别是BGR2Gray
和BGR2HSV
(opencv中没提供HSI,但这两个彩色空间差不多
#BGR2Gray
import
CV2 as cv
def
main():
src
=
cv.imread(
"../imgs/opencv.png"
)
cv.namedWindow(
"input"
, cv.WINDOW_AUTOSIZE)
cv.imshow(
"input"
, src)
gray
=
cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imwrite(
'gray.png'
, gray)
cv.imshow(
"gray"
, gray)
cv.waitKey(
0
)
cv.destroyAllWindows()
if
__name__
=
=
"__main__"
:
main()
def
main():
src
=
cv.imread(
"../imgs/opencv.png"
)
cv.namedWindow(
"input"
, cv.WINDOW_AUTOSIZE)
cv.imshow(
"input"
, src)
hsv
=
cv.cvtColor(src, cv.COLOR_BGR2HSV)
cv.imwrite(
'hsv.png'
, hsv)
cv.imshow(
"hsv"
, hsv)
# 分离通道
h, s, v
=
cv.split(hsv)
cv.namedWindow(
"h"
, cv.WINDOW_NORMAL)
cv.imshow(
"h"
, h)
cv.namedWindow(
"s"
, cv.WINDOW_NORMAL)
cv.imshow(
"s"
, s)
cv.namedWindow(
"v"
, cv.WINDOW_NORMAL)
cv.imshow(
"v"
, v)
cv.waitKey(
0
)
cv.destroyAllWindows()
if
__name__
=
=
"__main__"
:
main()