17_详解YUV

2022-11-07  本文已影响0人  咸鱼Jay

本文的主角是多媒体领域非常重要的一个概念:YUV。

简介

YUV,是一种颜色编码方法,跟RGB是同一个级别的概念,广泛应用于多媒体领域中。

也就是说,图像中每1个像素的颜色信息,除了可以用RGB的方式表示,也可以用YUV的方式表示。

vs RGB

对比RGB,YUV有哪些不同和优势呢?

体积更小

组成

RGB数据由R、G、B三个分量组成。

YUV数据由Y、U、V三个分量组成,现在通常说的YUV指的是YCbCr

YCbCr 当Y等于0.5时

兼容性

原始图像 RGB YCbCr

根据上面的图片,不难看出:

此外,你是否感觉:Y分量的内容看着有点眼熟?其实以前黑白电视的画面就是长这样子的。

YUV的发明处在彩色电视与黑白电视的过渡时期。

转换

公式1

Y = 0.257R + 0.504G + 0.098B + 16
U = -0.148R - 0.291G + 0.439B + 128
V = 0.439R - 0.368G - 0.071B + 128

R = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
B = 1.164(Y - 16) + 1.596(V - 128)

公式2

Y = 0.299R + 0.587G + 0.114B
U = 0.564(B - Y) = -0.169R - 0.331G + 0.500B
V = 0.713(R - Y) = 0.500R - 0.419G - 0.081B

R = Y + 1.403V
G = Y - 0.344U - 0.714V
B = Y + 1.770U

公式3

Y = 0.299R + 0.587G + 0.114B
U = -0.169R - 0.331G + 0.500B + 128
V = 0.500R - 0.419G - 0.081B + 128

R = Y + 1.403(V - 128)
G = Y - 0.343(U - 128) - 0.714(V - 128)
B = Y + 1.770(U - 128)

色度二次采样

原理

人眼的视网膜上,分布着两种感光细胞:视杆细胞视锥细胞

视网膜 视杆细胞和视锥细胞

人眼中有上亿个感光细胞,其中视杆细胞占了95%,而视锥细胞仅占5%。

因此,人眼对亮度的敏感程度要高于对色度的敏感程度,人眼对于亮度的分辨要比对颜色的分辨精细一些。

如果把图像的色度分量减少一些,人眼也丝毫感觉不到变化和差异。

概念

如果在色度分量上进行(相对亮度分量)较低分辨率的采样,也就是存储较多的亮度细节、较少的色度细节,这样就可以在不明显降低画面质量的同时减小图像的体积。上述过程称为:色度二次采样(Chroma Subsampling)。

采样格式

采样格式通常用A:B:C的形式来表示,比如4:4:4、4:2:2、4:2:0等,其中我们最需要关注的是4:2:0

色度二次采样 色度二次采样

上图中,不管是哪种采样格式,Y分量都是全水平、全垂直分辨率采样的,每一个像素都有自己独立的Y分量。

4:4:4

4:4:4

叉叉代表:亮度。

圆圈代表:色度。

4:2:2

4:2:2

4:2:0

4:2:0 MPEG-1 4:2:0 MPEG-2

存储格式

存储格式,决定了YUV数据是如何排列和存储的。本文只介绍一些常见的存储格式。

分类

YUV的存储格式可以分为3大类:

4:4:4

4:4:4

Planar

Y Y Y Y
Y Y Y Y
U U U U
U U U U
V V V V
V V V V
Y Y Y Y
Y Y Y Y
V V V V
V V V V
U U U U
U U U U

Semi-Planar

Y Y Y Y
Y Y Y Y
U V U V U V U V
U V U V U V U V
Y Y Y Y
Y Y Y Y
V U V U V U V U
V U V U V U V U

4:2:2

4:2:2

Planar

Y Y Y Y
Y Y Y Y
U U
U U
V V
V V
Y Y Y Y
Y Y Y Y
V V
V V
U U
U U

Semi-Planar

Y Y Y Y
Y Y Y Y
U V U V
U V U V
Y Y Y Y
Y Y Y Y
V U V U
V U V U

Packed

U Y V Y U Y V Y
U Y V Y U Y V Y
Y U Y V Y U Y V 
Y U Y V Y U Y V 
Y V Y U Y V Y U
Y V Y U Y V Y U

4:2:0

4:2:0

Planar

Y Y Y Y
Y Y Y Y
U U
V V
I420
Y Y Y Y
Y Y Y Y
V V
U U

Semi-Planar

Y Y Y Y
Y Y Y Y
U V U V
Y Y Y Y
Y Y Y Y
V U V U
4:2:0

格式转换

其他图片格式转YUV

ffmpeg -i in.png -s 512x512 -pix_fmt yuv420p out.yuv

上述命令生成的yuv文件大小是:393216字节 = 512 * 512 * 1.5字节。

YUV转其他图片格式

ffmpeg -s 512x512 -pix_fmt yuv420p -i in.yuv out.jpg

显示YUV

完整的YUV

可以通过ffplay显示YUV数据。

ffplay -s 512x512 -pix_fmt yuv420p in.yuv

# 在ffplay中
# -s已经过期,建议改为:-video_size
# -pix_fmt已经过期,建议改为:-pixel_format
ffplay -video_size 512x512 -pixel_format yuv420p in.yuv

单个分量

可以使用过滤器(filter)显示其中的单个分量(r、g、b、y、u、v)。

# 只显示r分量
ffplay -vf extractplanes=r in.png

# 只显示g分量
ffplay -vf extractplanes=g in.png

# 只显示b分量
ffplay -vf extractplanes=b in.png

# 只显示y分量
ffplay -video_size 512x512 -pixel_format yuv420p -vf extractplanes=y in.yuv
# 只显示u分量
ffplay -video_size 512x512 -pixel_format yuv420p -vf extractplanes=u in.yuv
# 只显示v分量
ffplay -video_size 512x512 -pixel_format yuv420p -vf extractplanes=v in.yuv
上一篇下一篇

猜你喜欢

热点阅读