本文转载自:FPGA入门到精通
RGB颜色空间和YUV颜色空间是图像处理中经常遇到的两个颜色空间,但它们的特性不一样,应用的场景有差异,所以经常会遇到有RGB转YUV、YUV转RGB的需求。
一、RGB与YUV的介绍
1、RGB颜色空间
RGB颜色空间,又称红绿蓝颜色空间,是一种基于红、绿、蓝三种基本颜色进行混合的颜色空间。RGB分别代表红色(Red)、绿色(Green)和蓝色(Blue),通过不同程度的三种颜色的叠加,可以产生丰富而广泛的颜色。RGB颜色空间在计算机图像处理、显示器显示、摄影和影视制作等领域具有广泛的应用。
R、G、B取值常用8比特表示,因此代表三基色的红、绿、蓝通道分别用0~255的整数表示强度。0表示无光,亮度最暗;255表示强度最大,亮度最亮。(0,0,0)表示纯黑色;(255,255,255)表示白色。
它起源于上世纪初,当时Thomas Young和Helmholtz先后提出了视觉的三原色学说,即视网膜存在三种视锥细胞,分别对红、绿、蓝三种光线敏感。当一定波长的光线作用于视网膜时,以一定的比例使三种视锥细胞分别产生不同程度的兴奋,这样的信息传至大脑中枢,就产生某一种颜色的感觉。
在显示器发明之后,人们开始使用发出不同颜色的光的荧光粉、滤色片或半导体发光器件来形成色彩。为了再现人眼能够感受到的大多数自然色彩,人们选择了红、绿、蓝三种颜色的发光体作为基本发光单元,并通过控制它们的发光强度来实现各种颜色。
RGB颜色空间的优点是直观且容易理解。然而,其缺点是R、G、B三个分量相互高度相关,当某个分量发生变化时,颜色很可能发生改变。
2、YUV颜色空间
YUV颜色空间,又常被称作YCbCr颜色空间,是用于数字电视的颜色空间,在ITU-R BT.601、BT.709、BT.2020标准中被明确定义,这三种标准分别针对标清、高清、超高清数字电视。Y是亮度,Cb(U)、Cr(V)表示色度,三个分量是相互独立的,它们分别表示图像的亮度、蓝色色差和红色色差。
Y分量表示图像的亮度信息,它描述了图像的明暗程度,是黑白电视信号需要的内容。U分量表示蓝色色差,它描述了蓝色和绿色之间的差异,用于还原图像中的蓝色和绿色。V分量表示红色色差,它描述了红色和绿色之间的差异,用于还原图像中的红色和绿色。
在广播电视中,使用YCbCr可解决黑白电视和彩色电视之间的信号兼容问题。
二、RGB与YUV互转的公式
这里主要介绍BT601: 标清数字电视(SDTV) 8bit
1、RGB转YUV
Y=0.299*R + 0.587*G+0.114*B
U=Cb=0.564*(B-Y) + 128 = 0.499704*B - 0.168636*R - 0.331068*G + 128 = 0.5*B - 0.169*R - 0.331*G + 128
V=Cr=0.713*(R-Y) + 128 = 0.499813*R - 0.418531*G - 0.081282*B + 128 = 0.5*R - 0.419*G - 0.081*B + 128
2、YUV转RGB
R = Y + 1.402*(V-128) = Y + 1.402V - 1.402*128
G = Y - 0.344*(U-128) - 0.714*(V-128) = Y - 0.344*U -0.714*V + 1.058*128
B = Y + 1.772*(U-128) = Y + 1.772*U - 1.772*128
四、Python实现
import cv2
# 1. 读取图像
rgb_image = cv2.imread('1280_720.bmp')
# 2. 将RGB图像转换为YUV图像
yuv_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2YUV)
# 3. 将YUV图像转回RGB图像
rgb_image_again = cv2.cvtColor(yuv_image, cv2.COLOR_YUV2RGB)
# 4. 显示图像
cv2.namedWindow("rgb", 0)
cv2.resizeWindow("rgb", 300, 180) # 设置窗口大小
cv2.namedWindow("yuv", 0)
cv2.resizeWindow("yuv", 300, 180) # 设置窗口大小
cv2.namedWindow("rgb_a", 0)
cv2.resizeWindow("rgb_a", 300, 180) # 设置窗口大小
cv2.imshow('rgb', rgb_image)
cv2.imshow('yuv', yuv_image)
cv2.imshow('rgb_a', rgb_image_again)
# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(100000)
# 5. 关闭所有窗口
cv2.destroyAllWindows()
五、FPGA实现
FPGA实现思路分享:分析一下上面两个公式,主要涉及乘法运算、有符号数处理、浮点数运算三个内容,需要采用流水线方式处理就行。
FPGA实现代码:暂不公开,需要的可以加入我的知识星球,正在更新图像处理实战专栏,详细文章、设计逻辑、完整工程代码都有。
六、总结
颜色空间的转换是数字图像处理中的重要部分,而RGB与YUV之间的转换又是其中最常用的一种。
通过了解RGB和YUV颜色空间的特性以及它们之间的转换公式,我们可以在FPGA上实现高效的颜色空间转换。