【原创】HSV和YCrCb色彩空间介绍

本文探讨了RGB、HSV和YCbCr三种色彩空间的特点,详细解析了HSV颜色空间的概念,包括色相、饱和度和明亮度的含义,并介绍了如何通过YCbCr和HSV色彩空间获取图像的亮度值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常

情况下,彩色图像使用R、G、B三个通道表示,这种通过三基色可以到其它的各种颜色,但是具体是哪种颜色,我们就无从可知,如果我想知道(R,G,B)三元组具体什么颜色呢?这时候可以用HSV颜色空间表示。

HSV颜色空间

HSV都是一种将RGB色彩模型中的点在原著坐标体系中的表示法。这中表示法试图做到比基于笛卡尔坐标系的几何结构RGB更加直观。HSV即色相(Hue),饱和度(Saturation),明亮度(Lightness),又称为HSB,其中B即英语Brightness。

  • 色相(H)是色彩的基本属性,就是平常所说的颜色,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。
  • 饱和度(S)是指色彩的纯度,越高色彩越纯,越低则逐渐变灰,取0-100%的数值。
  • 明度(V),取0-100%。

SV二者都把颜色描述在圆柱坐标系内的点,这个圆柱的中心轴取值为自底部的黑色到顶部的白色而在它们中间的是灰色,绕这个轴的角度对应于“色相”,到这个轴的距离对应于“饱和度”,而沿着这个轴的高度对应于“亮度”,“色调”或“明度”。

HSV在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心)。

上图中上半部分:3D模型截面。下半部分:将模型中三个参数的其中之一固定为常量,其它两个参数的图像。

注意:

  • 不同软件设定的HSV取值范围是不同的,openCV中色度是 [0,179], 饱和度是[0,255], 明亮度是[0,255]。
  • 在openCV中,HSV各种颜色的取值范围是这样定义的:

YCbCr颜色空间

YCbCr有的时候会被写作:YCBCR,是色彩空间的一种,通常会用于影片中的影像连续处理,或是数字摄影系统中。Y为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成分。

上图中四部分依次是彩色图像的原图,彩色影像只有Y成分的图、只有Cb成分的图、和只有Cr成分的图。同时注意的是只有Y成分的图基本等同于彩色图像的灰度图。

如何获得图像的亮度?

方法一,将彩色度或转化为灰度图,这样每个像素值都是灰度值,也就是亮度值

方法二,将RGB三色图转化YCbCr彩色空间,第一通道(Y成分)就是亮度值

mport os
import numpy as np
import cv2
import sys

im_path = sys.argv[1]
im = cv2.imread(im_path)

if im is None:
	print im_path, " not exist"
	sys.exit()
h, w = im.shape[:2]
num = h*w
im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2YCR_CB)

ycrcb_bright = 1.0*np.sum(im_ycrcb[:,:,0])/num
print 'YCrCb model Bright Value:', ycrcb_bright

im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
gray_bright = np.sum(im_gray)*1.0/num
print 'Gray model Bright Value:', gray_bright

im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
hsv_bright = np.sum(im_hsv[:,:,2])*1.0/num
print 'hsv model Bright Value:', hsv_bright

输出

YCrCb model Bright Value: 124.199016571
Gray model Bright Value: 124.199016571
hsv model Bright Value: 179.870040894

可见HSV空间的明亮度值,和我们说的亮度值是有差异的。

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、付费专栏及课程。

余额充值