Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)

一,色彩空间分类

1.GRAY色彩空间

GRAY(灰度图像)通常指8位灰度图,具有256的个灰度级,像素值的范围是[0,255]。当图像由RGB色彩空间转换为GRAY色彩空间时,处理方式如下:

GRAY=0.299*R+0.587*G+0.114*B

上述是标准转换方式,也是OpenCV中常用的转换方式,有时,也可以用简化形式:

Gray=(R+G+B)/3

2.XYZ色彩空间

XYZ色彩空间是一种更便于计算的色彩空间,它可以和RGB色彩空间相互转换。

RGB转XYZ:

XYZ转RGB:

3.YCrCb色彩空间

在YCrCb色彩空间中,Y代表光源的亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。

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的值为:

YCrCb色彩空间到RGB色彩空间的转换公式:

R=Y+1.403*(Cr-delta)

G=Y-0.714*(Cr-delta)-0.344*(Cb-delta)

B=Y+1.773*(Cb-delta)

其中,delta的值与上图相同。

4.HSV色彩空间

HSV色彩空间是一种面向视觉感知的颜色模型,包含三要素:色调(色相),饱和度,亮度。色调指光的颜色,饱和度指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。下面介绍三要素的取值范围:

色调:我们将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色,色调的取值范围是[0,360]。

饱和度:表示所有颜色的纯度值和该颜色的最大纯度值之间的比值,取值为[0,1]。饱和度的值为0时,只有灰度。

亮度:表示色彩的明亮程度,取值范围也是[0,1]

需要注意的是,从RGB色彩空间转换到HSV色彩空间之前,需要先将RGB色彩空间的值转换到[0,1]之间,再进行处理,具体转换方法为:

计算时可能出现H<0的情况,如果出现这种情况,需要对H进行进一步计算,如下:

HSV色彩空间到RGB色彩空间的转换公式,Opencv官方文档中有具体公式,在此不做赘述。

5.HLS色彩空间

HLS色彩空间包含的三要素是色调H,光亮度/明度L,饱和度S。HLS与HSV色彩空间相似,只是在具体表示上,用“光亮度明度”代替了“亮度”。

6.CIEL*a*b*色彩空间

CIEL*a*b*色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。

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

CIEL*a*b*色彩空间中的L*分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;

a*分量表示从红色到绿色的范围,取值范围是[-127,127],b*分量表示从黄色到蓝色的范围,取值范围是[-127,127]。

需要注意的是,从RGB色彩空间转换到CIEL*a*b*色彩空间之前,需要先将RGB色彩空间的值转换到[0,1]之间,再进行处理,具体转换方法为:

其中,

7.CIEL*u*v*色彩空间

CIEL*u*v*色彩空间和CIEL*a*b*色彩空间一样,都是均匀的颜色模型,但CIEL*u*v*色彩空间对红色的变化比较敏感,但对蓝色的变化不太敏感。

RGB色彩空间到CIEL*u*v*色彩空间的转换公式:

先从RGB色彩空间转换到XYZ色彩空间:

再从RGB色彩空间到CIEL*u*v*色彩空间的转换公式:

8.Bayer色彩空间

Bayer色彩空间能从单平面R,G,B交错表内获得彩色图像

Bayer色彩空间交错表

二,类型转换实例

1.类型转换函数

在OpenCV内,我们使用cv2.cvtColor()函数实现色彩空间的转换。该函数能实现多个色彩空间之间的转换,其语法格式为:

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

2.通过数组观察转换效果

# 将BGR图像转换为灰度图像
import cv2
import numpy as np
img=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)
rst=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print("img=\n",img)
print("rst=\n",rst)
print("像素点(1,0)直接计算得到的值=",img[1,0,0]*0.114+img[1,0,1]*0.587+img[1,0,2]*0.299)
print("像素点(1,0)使用公式cv2.cvtColor()转换值=",rst[1,0])

运行结果:

# 将图像在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=\n",img)
print("rgb=\n",rgb)
print("bgr=\n",bgr)

运行结果:

3.图像处理示例

# 将图像在BGR模式和灰度图像之间相互转换
import cv2
img=cv2.imread("moon.png")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
rgb=cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
# 打印shape
print("img.shape=",img.shape)
print("gray.shape=",gray.shape)
print("rgb.shape=",rgb.shape)
# 显示效果
cv2.imshow("img",img)
cv2.imshow("gray",gray)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destoryAllWindows()

运行结果:

# 将图像从BGR模式转换成RGB模式
import cv2
img=cv2.imread("moon.png")
rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
cv2.imshow("img",img)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destoryAllWindows()

运行结果:

rgb版有种邪典的感觉...emm

1. 色彩换: dst = cv.cvtColor(src,code) 常用的是换成 灰度图像 cv.COLOR_BGR2GRAY HSV图像cv.COLOR_BGR2HSV YUV图像 cv.COLOR_BGR2YUV YCrCb图像 cv.COLOR_BGR2YCrCb 其中hsv里:h通道数值范围是0-180,s通道范围是0-255,v通道范围是0-255 2. import cv2 as cv import numpy as np def extrace_object_demo(): capture = cv.VideoCapture("E:/opencv/picture/donghua.avi") while(True): ret,frame = capture.read() #cv.inRange(src,阈值下限,阈值上限) #作用:提取图像在阈值中间的部分 hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV) hsv_low = np.array([100,43,46])#blue的hsv阈值 hsv_high = np.array([124, 255, 255]) mask = cv.inRange(hsv,hsv_low,hsv_high) if ret ==False: break cv.imshow("mask",mask) cv.imshow("video_window",frame) c =cv.waitKey(20) if c==27: break def color_space_demo(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) cv.imshow("2",gray) hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) cv.imshow("3",hsv) yuv = cv.cvtColor(image,cv.COLOR_BGR2YUV) cv.imshow("4",yuv) Ycrcb =cv.cvtColor(image,cv.COLOR_BGR2YCrCb) cv.imshow("5",Ycrcb) src = cv.imread("E:/opencv/picture/test1.jpg") b,g,r = cv.split(src) #cv.split 多通道图像的分离 cv.imshow("b",b) cv.imshow("g",g) cv.imshow("r",r) cv.namedWindow("1") src[:,:,2] = 0 cv.imshow("1",src) src = cv.merge([b,g,r])#cv.merge 各个通道的合并 cv.imshow("merge",src) src[:,:,2] = 0 #color_space_demo(src) extrace_object_demo() cv.waitKey(0) cv.destroyAllWindows() 总结: 1. 提取图像在阈值中间的部分,用二值化表示出来。用cv.inRange命令 cv.inRange(src,阈值下限,阈值上限) #作用:提取图像在阈值中间的部分 例如: hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV) hsv_low = np.array([100,43,46])#blue的hsv阈值 hsv_high = np.array([124, 255, 255]) mask = cv.inRange(hsv,hsv_low,hsv_high) 2. 多通道的分离与合并: cv.split(src) #cv.split 多通道图像的分离 例如 b,g,r = cv.split(src) #cv.split 多通道图像的分离 cv.imshow("b",b) cv.imshow("g",g) cv.imshow("r",r) cv.merge([b,g,r])#cv.merge 各个通道的合并 例如: src = cv.merge([b,g,r])#cv.merge 各个通道的合并 cv.imshow("merge",src)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值