在图像处理过程中,经常会遇到YUV与RGB之间的转换,这个转换有不同标准,有多种转换公式,
有时,由于没有成对的匹配上,导致了效果异常。现在总结各种标准的转换公式。
主要分BT601,BT709和BT2020,三种标准下都有full range和limit range的区分。这里主要列除了转换矩阵,对于limit range,Y有偏置,对8bit是np.array([16,128,128]),full range的偏置为np.array([0,128,128])。
r2y_limit_range_601 = np.array([
[ 0.257, 0.504, 0.098],
[-0.148, -0.291, 0.439],
[ 0.439, -0.368, -0.0714]])
y2r_limit_range_601 = np.array([
[1.1644, 0.0, 1.5958],
[1.1644, -0.3938, -0.8130],
[1.1644, 2.0172, -0.0]])
r2y_full_range_601 = np.array([
[ 0.299, 0.587, 0.114],
[-0.1687, -0.3313, 0.5],
[ 0.5, -0.4187, -0.0813]])
y2r_full_range_601 = np.array([
[1.0, -0.0, 1.402],
[1.0, -0.3441, -0.7141],
[1.0, 1.772, -0.0]])
r2y_limit_range_709 = np.array([
[ 0.1826, 0.6142, 0.0620],
[-0.1006, -0.3386, 0.4392],
[ 0.4392, -0.3989, -0.0403]])
y2r_limit_range_709 = np.array([
[1.1644, 0.0, 1.7927],
[1.1644, -0.2132, -0.5329],
[1.1644, 2.1124, -0.0]])
r2y_full_range_709 = np.array([
[ 0.2126, 0.7152, 0.0722],
[-0.1146, -0.3854, 0.500],
[ 0.500, -0.4542, -0.0458]])
y2r_full_range_709 = np.array([
[1.0, 0.0, 1.5748],
[1.0, -0.1873, -0.4681],
[1.0, 1.8556, 0.0]]
)
r2y_limit_range_2020 = np.array([
[0.2256, 0.5823, 0.0509],
[-0.1227, -0.3166, 0.4392],
[0.4392, -0.4039, -0.0353]
])
y2r_limit_range_2020 = np.array([
[1.1644, -0.0, 1.6787],
[1.1644, -0.1873, -0.6504],
[1.1647, 2.1418, 0.0]])
r2y_full_range_2020 = np.array([
[ 0.2627, 0.6780, 0.0593],
[-0.1396, -0.3604, 0.500],
[ 0.500, -0.4598, -0.0402]
])
y2r_full_range_2020 = np.array([
[1.0, -0.0, 1.4746],
[1.0, -0.1646, -0.5714],
[1.0, 1.8814, -0.0]]
)
BT601 full range rgb=[0, 255], y=[16, 235], uv=[16, 240] R = 1.164 * (Y - 16) + 1.596 * (V - 128) G = 1.164 * (Y - 16) - 0.392 * (U - 128) - 0.812 * (V - 128) B = 1.164 * (Y - 16) + 2.016 * (U - 128)Y = 0.257 * R + 0.504 * G + 0.098 * B + 16 U = -0.148 * R
BT601 和 BT709由于在处理相机实时图像数据时,需要将相机采集的YUV数据转换为RGB,根据GPUImage的源码看到是有三种转换矩阵用于将YUV数据转换成RGB数据,分别是//BT.601,whichisthestandardforSDTV.
GLfloatkColorConversion601Default[]={
1.164,1.16...
长春大学计算机科学与技术学院 2004
摘 要:首先对色彩空间作了简要的介绍,分别介绍了各种色彩空间的原理、YUv格式以及
Y1Ⅳ 与RGB的关系,并且给出了换算公式,将Y1Ⅳ 的色彩空间与RGB的色彩空间的大小进行了
比较。最后介绍了Y1Ⅳ 的部分取样原理,并分别将YUV444.、YUV422、YUV411和Y1Ⅳ420这四
种取样方式进行了比较。
关键词:色彩空间;Y1Ⅳ ;RGB;Y1Ⅳ 格式;部分取样
一般来讲,我们把YUV、Y‘UV、YCbCr, YPbPr包含在YUV颜色模型的范围内,其中Y都表示亮度,UV表示两个色度分量,但是具体的颜色模型的用途又各不相同,当然,他们与RGB的互转公式也就不相同。在电视系统发展的早期,YUV和Y’UV都是颜色信息的模拟信号编码形式,虽然Y和Y’都表示亮度,但是两种亮度的意义却天差地别,Y用来代指luminance,表示的是自然颜色的亮度,而Y‘代指luma,表示的是经过伽马压缩之后电信号的强度。在现在的计算机系统中,YUV一般用来代指YCbCr,用来表示文件的编码格
从前文已经知道,R,G,B,3个分量都跟 亮度密切相关,也就是 3个分量里面都有大量的亮度信息。
RGB 转 YUV 的过程实际上就是 把 RGB 3分量里面的亮度信息 提取出来,放到 Y 分量。再把 RGB 3分量里面的 色调 ,色饱和度 信息提取出来放到 U跟 V分量。
所以这是一个信息提取过程,需要经过大量的实验。
提取 Y 亮度信息的公式如下:
Y = Kr * R + Kg * G + Kb * B
上面公式中的 K 是一个权重因子,Kr 代表 红色通道的权重,Kg 代表
原创不易 转载请注明出处和作者
关于写这篇文章的原因:
本人也是摸索了很长时间才弄懂其中的原理,里面涉及的知识点太多了, 比如色彩空间, Gamma, 什么的, 里面还会涉及到很多的协议, 比如 BT601 BT709, BT2020,RP177 等, 一不小心就会写错, 然后色彩可能就不准确了, 可能偏白 偏黑或者偏色
自己也踩过很多坑, 然后把这些经验写出来.
我在前面的两篇随笔中,写到了YUV与RGB的互转公式,也写了一些SSE指令学习的常用指令。因为接下来我决定暂停对SSE指令的简单翻译,而要把他用到实践中去。因此会贴上大篇幅的看起来让人头晕目眩的代码,不过我会尽力写好注释,以免大家看起来比较费劲。
既然说SSE能够对重复大量相同运算的数据在运算效率上有很大的提升,那就需要与高级语言(因为我常用的是C++,所以就采用C++语言)做一个对比。
在此...
关于写这篇文章的原因:
本人也是摸索了很长时间才弄懂其中的原理,里面涉及的知识点太多了,比如色彩空间,比如Gamma,里面还会涉及到很多的协议,比如BT601 BT709,BT2020,RP177等,一不小心就会写错,然后色彩可能就不准确了,可能偏白偏黑或者偏色
自己也踩过很多坑,然后把这些经验写出来,防止大家踩重复的坑,如果文章有不够严谨的地方,请及时...