OpenCV-python学习笔记(四)——色彩空间类型转换

第四章 色彩空间类型转换

一、色彩空间基础

​ 常见的色彩空间有:RGB色彩空间,XYZ色彩空间,YCrCb色彩空间,HSV色彩空间,HLS色彩空间、CIELab色彩空间、CIELuv色彩空间、Bayer色彩空间

4.1.1 GRAY色彩空间

​ GRAY(灰度图像)指8位灰度图,像素范围[0,255]

​ **RGB转为GRAY:**Gray=0.299·R+0.587·G+0.114·B

​ 简化方式为: G r a y = ( R + G + B ) / 3 Gray=(R+G+B)/3 Gray=(R+G+B)/3

​ 其中R=G=B=Gray

4.1.2 XYZ色彩空间

XYZ色彩空间是由CIE(International Commission on lllumination)定义的,是一种更便于计算的色彩空间,它可以与RGB色彩空间相互转换。

(1)RGB转为XYZ
在这里插入图片描述

(2)XYZ转为RGB
在这里插入图片描述

4.1.3 YCrCb色彩空间

​人眼视觉系统(HVS,Human Visual System)对颜色的敏感度要低于对亮度的敏感度。在传统的RGB色彩空间内,RGB三原色具有相同的重要性,但是忽略了亮度信息。
​在YCrCb色彩空间中,Y代表光源的亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。

(1)RGB转YCrCb色彩空间

Y=0.299·R+0.587·G+0.114·B
Cr= (R-Y) ×0.713+delta
Cb= (B-Y)×0.564+delta

delta=128(8位图像),32768(16位图像),0.5(单精度图像)

(2)YCrCb色彩空间转RGB

R=Y+1.403·(Cr-delta)
G=Y-0.714·(Cr-delta) -0.344·(Cb-delta)
B=Y+1.773·(Cb-delta)

4.1.4 HSV色彩空间

​ RGB是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定的差异HSV色彩空间是一种面向视觉感知的颜色模型。HSV色彩空间从心理学和视觉的角度出发,指出人眼的色彩知觉主要包含三要素:色调(Hue,也称为色相)、饱和度(Saturation)、亮度(Value)色调指光的颜色,饱和度是指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。

(1)色调:色调与混合光谱中的主要光波长相关,例如“赤橙黄绿青蓝紫"分别表示不同的色调。如果从波长的角度考虑,不同波长的光表现为不同的颜色,实际上它们体现的是色调的差异。
(2)饱和度:指相对纯净度,或一种颜色混合白光的数量。纯谱色是全饱和的,像深红色(红加白)和淡紫色(紫加白)这样的彩色是欠饱和的,饱和度与所加白光的数量成反比。
(3)亮度:反映的是人眼感受到的光的明暗程度,该指标与物体的反射度有关。对于色彩来讲,如果在其中掺入的白色越多,则其亮度越高;如果在其中掺入的黑色越多,则其亮度越低。

​色调取值[0,360],饱和度和亮度均为[0,1]

在这里插入图片描述
在这里插入图片描述

4.1.5 HlS色彩空间

​ HLS 色彩空间包含的三要素是**色调H(Hue)、光亮度/明度L (Lightness)、饱和度s (Saturation) **

光亮度/明度:用来控制色彩的明暗变化,它的取值范围也是[0,1]。我们通过光亮度/明度的大小来衡量有多少光线从物体表面反射出来。光亮度/明度对于眼睛感知颜色很重要,因为当一个具有色彩的物体处于光线太强或者光线太暗的地方时,眼睛是无法准确感知物体颜色的。

4.1.6 CIELab色彩空间

​ CIELab色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。从视觉感知均匀的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中,如果人所观察到的两种颜色的区别程度,与这两种颜色在该色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。

​ CIELab色彩空间中的L分量用于表示像素的亮度,取值汜围是[0,100],表示从纯黑到纯白;a分量表示从红色到绿色的范围,取值范围是[-127,127];b分量表示从黄色到蓝色的范围,取值范围是[-127,127]。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4FpZPleW-1658413423764)(C:\Users\Masiyuan\AppData\Roaming\Typora\typora-user-images\image-20220604110137457.png)]

4.1.7 CIELuv色彩空间

​ CIELuv色彩空间同CIELab色彩空间一样,都是均匀的颜色模型。CIELuv色彩空间与设备无关,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。

4.1.8 Bayer色彩空间

​ 输出的RGB图像的像素点值,是根据当前点的1个、2个或4个邻域像素点的相同颜色的像素值获得的。上述模式能够通过移动一个左边的像素或者上方的像素来完成修改。在函数cv2.cvtColor ()的色彩空间转换参数中,通常使用两个特定的参数x和y来表示特定的模式。

二、类型转换函数

cv2.cvColor()函数实现色彩空间的变换

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

**(1)dst:**表示输出图像,与原始输入图像具有同样的数据类型和深度。
(2)src:表示原始输入图像。可以是8位无符号图像、16位无符号图像,或者单精度浮点数等。
**(3)code:**色彩空间转换码。
**(4)dstCn:**是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code得到。

BGR色彩空间与传统的RGB色彩空间不同。对于一个标准的24位位图,BGR色彩空间中第1个8位(第1个字节)存储的是蓝色组成信息(Bluecomponent),第2个8位(第2个字节)存储的是绿色组成信息(Greencomponent),第3个8位(第3个字节)存储的是红色组成信息(Red component同样,其第4个、第5个、第6个字节分别存储蓝色、绿色、红色组成信息,以此类推.

颜色空间的转换都用到了如下约定:

8位图像值的范围是[0,255]。

16位图像值的范围是[0,65 535]

浮点数图像值的范围是[0.0~1.0]

三、类型转换实例

3.3.1 数组实例

例1:BGR和RGB模式转换

import cv2
import numpy as np
img=np.random.randint (0,256,size=[2,4,3],dtype=np.uint8)
rgb=cv2.cvtColor ( img,cv2.COLOR_BGR2RGB)
bgr=cv2.cvtColor (rgb,cv2.COLOR_RGB2BGR)
print ("img=In",img)
print ("rgb=\n",rgb)
print ("bgr=\n",bgr)
3.3.1 图像实例

例1:图像从BGR转为RGB和灰度:

import cv2
lena=cv2.imread ( "lenacolor.png",-1)
rgb=cv2.cvtColor (lena,cv2.COLOR_BGR2RGB)
gray=cv2.cvtColor(rgb,cv2.COLOR_BGR2GRAY)
cv2.imshow ("lena",lena)
cv2.imshow ( "rgb",rgb)
cv2.imshow ( "gray",gray)
cv2.waitKey ()
cv2.destroyAllWindows ()

四、HSV色彩空间讨论

4.4.1 基础知识

(1)色调H

色调取值范围[0,360],把色调映射到[0,255],所以把色调值除以2
在这里插入图片描述
(2)饱和度S

范围[0,1],将其映射到[0,255]范围内

(3)亮度V

范围[0,1],将其映射到[0,255]范围内,亮度值越大,图像越亮;亮度值越低,图像越暗。当亮度值为0时,图像是纯黑色。

4.4.2 标记指定颜色
4.4.2.1 inRange函数锁定特定值

dst=cv2.inRange (src,lowerb,upperb)

**(1)dst:**表示输出结果,大小和src一致。
**(2)src:**表示要检查的数组或图像。
**(3)lowerb:**表示范围下界。
**(4)upperb:**表示范围上界。

如果src值处于该指定区间内,则dst中对应位置上的值为255
如果src值不处于该指定区间内,则dst中对应位置上的值为0

**示例:**将[100,200]内的值标注出来

import cv2
import numpy as np
img=np.random.randint (0,256,size=[5,5],dtype=np.uint8)
min=100
max=200
mask=cv2.inRange ( img,min,max)print ("img=In",img )
print ("mask=In",mask)
4.4.2.2 基于掩码的按位与显示ROI

**示例:**不感兴趣区用黑色显示,掩码的方式将其设置为0

import cv2
import numpy as np
img=np.ones ([5,5],dtype=np.uint8) *9
mask=np.zeros ([5,5],dtype=np.uint8)
mask[0:3,0]=1
mask[2:5,2:4]=1
roi=cv2.bitwise_and ( img,img,mask=mask)
print ("img=\n",img )
print ("mask=\n",mask)print ("roi=\n",roi)
4.4.2.3 显示特定颜色

**示例:**提取opencv的logo的蓝色

import cv2
import numpy as np
opencv=Cv2.imread ( "opencv.jpg")
hsv=cv2.cvtColor (opencv,cv2.COLOR_BGR2HSV)
cv2.imshow ( 'opencv',opencv)
#=======指定蓝色值的范围=======
minBlue=np.array ([110,50,50])
maxBlue=np.array ([130,255,255])
#确定蓝色区域
mask=cv2.inRange ( hsv,minBlue,maxBlue)
#通过掩码控制的按位与运算,锁定蓝色区域
blue=cv2.bitwise_and (opencv,opencv,mask=mask)
cv2.imshow ('blue',blue)
cv2.waitKey ()
cv2.destroyAllWindows ()
4.4.2.4 实现艺术效果

将一幅图像的H通道和S通道的值保持不变,而将其V通道的值都调整为255,即设置为最亮,观察得到的艺术效果。

五、alpha通道(透明度)

示例:对图像aipha通道处理

import cv2
img=cv2.imread("lenacolor.png")
bgra=cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
b,g,r,a=cv2.split(bgra)
a[:,:]=125
bgra125=cv2.merge([b,g,r,a])
a[:,:]=0
bgra0=cv2.merge([b,g,r,a])
cv2.imshow("img",img)
cv2.imshow("bgra",bgra)
cv2.imshow("bgra125",bgra125)
cv2.imshow("bgra0",bgra0)
cv2.waitKey ()
cv2.destroyAllWindows ()
#======分别保存alpha通道值的图像========#
cv2.imwrite ("bgra.png",bgra)
cv2.imwrite ("bgra125.png",bgra125)
cv2.imwrite ("bgra0.png",bgra0)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值