【图像处理】颜色空间

这里介绍RGB、YUV颜色空间,及其他们的转换。


RGB颜色空间

通过RGB三个通道的变化及其它们的相互叠加来得到各式各样的颜色。
不同的图片可能采用不同的位深来表示RGB分量,比较常见的有:
RGB8 :256色,每个像素用8为表示,需要用调色板。
调色板表示存储颜色信息的区域,以RGB8的值为索引,在调色板中获取对应的颜色分量信息。
RGB565:每个像素用16位表示,R:G:B = 5:6:5

RGB24 :每个像素用24位表示,RGB分量各使用8位。


YUV颜色空间

YUV:Y表示亮度信息,UV表示色度信息。
对于YUV颜色空间,通常一个Y并不对应一对UV。这是由于人的眼睛对光比较敏感,在视频信号的传输过程中,为了提高信道利用率,UV分量通常进行压缩。常用的有YUV420,YUV411,YUV422。后面的422,411,420代表色度抽样。
当YUV444时,各分量不进行压缩。

YUV的色度抽样

需要注意的是:
Y:U:V = 4:2:0 表示:
1)第一个值:每行4个像素,总共两行。(这里的两行是标准中的约定,而4则代表着每行4个像素
2)第二个值:第一行中,有2个色度抽样。表示4个像素平分2个色度抽样。
3)第三个值:第二行中,没有色度抽样,那么就会采用与上一行相同的色度抽样。

一个色度抽样代表一对UV,那么在4:2:0的色度抽样中,每对UV代表2x2区域的像素。
如下图所示。



而4:1:1中,每对UV代表1x4区域。
在一些教科书中,经常有这样的表示,每个黑点对应于一对UV。



YUV420码流

以下为具体编码时的码流格式:


YUV420中,每个像素的亮度值都会传输,而每个色度值只会有一对U和V。每对UV对应于一个2x2的数据块。

对应于具体的马骝具体的yuv数据获取:
<span style="font-family:SimSun;font-size:14px;"><span style="font-family:SimHei;font-size:18px;">size.total = size.width * size.height;
y = yuv[position.y * size.width + position.x];
u = yuv[(position.y / 2) * (size.width / 2) + (position.x / 2) + size.total];
v = yuv[(position.y / 2) * (size.width / 2) + (position.x / 2) + size.total + (size.total / 4)];</span></span>

RGB转YUV

以下为具体的RGB转YUV矩阵运算。这些公式来源于NTSC standard 


所以,一般RGB转灰度时,有:

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


参考资料:
https://en.wikipedia.org/wiki/YUV#cite_note-13

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)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值