Video Basic
Abstract |
Video Basic |
Authors |
Walter Fan |
Status |
WIP |
Updated |
2024-08-21 |
概述
视频是图像的集合, 按照一定的频率收集和回放, 它有亮度, 对比度, 饱和度。
颜色
光的三基色
Red, Green, Blue 红绿蓝称为三基色, 它们按不同比例合成可以产生其他颜色
..code-block:
R + G = Yellow 黄色
G + B = Cyan 青色
R + B = Magenta 品红
R + Cyan = White
G + Magenta = White
B + Yellow = White
色彩三要素
色相: 也称色调, 由光波波长的长短决定的视觉我, 是区别不同颜色的标准
亮度: lightness, brightness, 反映颜色的明暗程度
纯度: purity, saturation, 反映颜色的深浅程度或者鲜艳程度
颜色模型
RGB
首先就是rgba系列的格式, RGBA色彩主要用于色彩的显示和描述。
常见的有RGBA/ARGB/BGRA/ABGR/RGB/BGR。这些格式都比较好理解了。
R、G、B、A分别表示红绿蓝及透明通道。 以RGBA为例, 就是4个字节表示一个颜色值, 排列方式就是RGBARGBARGBA这样排列。
而RGB, 就是三个字节表示一个颜色值, 没有透明通道, 排列方式就是RGBRGBRGB。
在通常的视频中, 也是没有透明通道的 (也有例外, 比如MOV格式, 是可以包含透明通道的)。
所以当RGBA编码为视频色彩时, A是会被丢掉的。 当然, 上面说的, 是将每个色彩都用一个字节来表示的情况。
RGBA也有RGBA_8888, RGBA_4444,RGB565等等众多格式, 也就是并不是每个颜色都用一个字节来表示。
RGB24: B->G->R, 每个分量用 8bit 来表示
RGB32: 对每个像素增加 8bit 用来表示 alpha 通道 (透明度)
RGB565: 用两个字节来表示RGB三个色彩, R占5位, G占6位, B占5位。
RGB565与RGB24相比, 色彩上稍有损失, 一般情况下, 不细致对比, 不容易发现这个损失, 但是内存上会节约1/3的大小。
import cv2
img = cv2.imread("../../material/xjl.png")
print(img)
YUV
Y 指亮度信号, U 和 V 指色度信号 (色相加纯度): 它指某种颜色与同一亮度的白色之间的差别 Y 明亮度, U 色度, V 浓度, 参见 YUV 格式
import numpy as np
#input is a RGB numpy array with shape (height,width,3), can be uint,int, float or double, values expected in the range 0..255
#output is a double YUV numpy array with shape (height,width,3), values in the range 0..255
def RGB2YUV( rgb ):
m = np.array([[ 0.29900, -0.16874, 0.50000],
[0.58700, -0.33126, -0.41869],
[ 0.11400, 0.50000, -0.08131]])
yuv = np.dot(rgb,m)
yuv[:,:,1:]+=128.0
return yuv
#input is an YUV numpy array with shape (height,width,3) can be uint,int, float or double, values expected in the range 0..255
#output is a double RGB numpy array with shape (height,width,3), values in the range 0..255
def YUV2RGB( yuv ):
m = np.array([[ 1.0, 1.0, 1.0],
[-0.000007154783816076815, -0.3441331386566162, 1.7720025777816772],
[ 1.4019975662231445, -0.7141380310058594 , 0.00001542569043522235] ])
rgb = np.dot(yuv,m)
rgb[:,:,0]-=179.45477266423404
rgb[:,:,1]+=135.45870971679688
rgb[:,:,2]-=226.8183044444304
return rgb
从 RGBA 转换为 YUV: opencv doc
YUV 采样格式的分类
YUV444 3 bytes per pixel (12 bytes per 4 pixels)
YUV422 4 bytes per 2 pixels (8 bytes per 4 pixels)
YUV411 6 bytes per 4 pixels
YUV420p 6 bytes per 4 pixels, reordered
import cv2
def bgr2yuv(img):
yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
y, u, v = cv2.split(yuv_img)
return y, u, v
def yuv2bgr(y, u, v):
yuv_img = cv2.merge([y, u, v])
bgr_img = cv2.cvtColor(yuv_img, cv2.COLOR_YUV2BGR)
return bgr_img
def main():
orig_img = cv2.imread('test.png')
y, u, v = bgr2yuv(orig_img)
bgr_img = yuv2bgr(y, u, v)
cv2.imshow('orig_img', orig_img)
cv2.imshow('Y channel', y)
cv2.imshow('U channel', u)
cv2.imshow('V channel', v)
cv2.imshow('bgr_img', bgr_img)
cv2.waitKey(0)
if __name__ == '__main__':
main()
1 void YUVfromRGB(double& Y, double& U, double& V, const double R, const double G, const double B)
2 {
3 Y = 0.257 * R + 0.504 * G + 0.098 * B + 16;
4 U = -0.148 * R - 0.291 * G + 0.439 * B + 128;
5 V = 0.439 * R - 0.368 * G - 0.071 * B + 128;
6 }
7
8 void RGBfromYUV(double& R, double& G, double& B, double Y, double U, double V)
9 {
10 Y -= 16;
11 U -= 128;
12 V -= 128;
13 R = 1.164 * Y + 1.596 * V;
14 G = 1.164 * Y - 0.392 * U - 0.813 * V;
15 B = 1.164 * Y + 2.017 * U;
16 }
数字图像
黑白图像
灰度图像
彩色图像
显示分辨率
现代显示模式
模式 |
分辨率 |
90p |
160 x 90 |
180p |
320 x 180 |
240p |
352 x 240 |
360p |
640 x 360 |
720p |
1280 x 720 |
1080p |
1920 x 1080 |
2K |
3840 × 2160 |
4K |
7680 × 4320 |
宽屏和标准PC屏幕模式
模式 |
分辨率 |
w288p |
512x288 |
w448p |
768x448 |
w576p |
1024x576 |
VGA |
640x480 |
SVGA |
800x600 |
XGA |
1024x768 |
SXGA |
1280x1024 |
旧的显示模式
模式 |
分辨率 |
CIF |
352x288 |
QCIF |
176x144 |
SQCIF |
128x96 |
4CIF |
704x576 |
16CIF |
1408x1152 |
视频编码的问题
图像格式
JPG
WEBP
PNG
视频会议中有哪些流行的分辩率?
p 代表逐行扫描
90p: 160 * 90
180p: 320 * 180
360p: 640 * 360
720P: 1280 * 720
1080P: 1920 * 1080
2K: 3840 * 2160
4K: 7680 * 4320
高宽比
4:3
16:9
16:10
FrameDepth Bits
8 bit
10 bit
12 bit
29 bit
Frame Rate 帧率
24
25
30
60
120
视频压缩
视频是由一系列时间上有序的图像帧所组成的, 这些图像之间有许多的冗余信息。
视频压缩方法主要包括去除空间上, 时间上, 统计上以及感知上的冗余信息
术语
GOP: Group of Picture 代表一组连续的图像帧, 通常其第一帧为 I 帧 (关键帧 Intra-Frame), 其后跟着 B 帧和 P 帧 (Inter-Frame)
DTS: Decode Timestamp
PTS: Presentation Timestamp
IDR 帧: 从 IDR 帧开始, 所有后面的帧都不会参考 IDR 帧之前的帧
ITU-T 国际电信联盟标准组织
CCITT 国际电报电话咨询委员会
H.261
H.261 是 CCITT 在 1988 年提出的, 于1990 年为 ITU-T 所采纳, 它是为了在 ISDN 电话线路上进行可视电话, 视频会议和提供其他视听服务而制定的。 该视频编码器只提供 p * 64 kbps 的码率 (p 取值范围为 1 - 30), 编码的延迟必须低于 150 ms。
H.262/MPEG-2 编码
MPEG-2 编码即 H.262 使用了 DCT (Discrete Cosine Transform 离散余弦变换), 运动补偿和霍夫曼编码, 对数据从大到小定义了 sequence, GOP, Picture, Slice, MacroBlock (宏块), Block 等多个层次
MPEG-2 中的宏块定义了4:2:0, 4:2:2, 4:4:4 不同的结构, Block 则代表了 8*8 个采样值。
H.263
H.263 是一个经过改进的视频编码标准, 主要用于 PSTN 网络上的视频会议或其他可视化服务, 用于在低码率 (64kbps )及以下进行通信。 H.264 于 1995 年被ITU-T 所采纳, 类似于 H.261 在帧间编码中采用预测编码来减少时间冗余信息, 对剩下的信号采用变换编码来减少空间冗余信息 (如帧内编码及帧间预测的差分宏块)。
H.264
H.264 是当下最流行的视频压缩标准, 其第一版的草案于 2003 年 5 月完成, 它也称为 MPEG-4 的第十部分或者 AVC(Advanced Video Codec 高级视频编码)。 H.264 规定了基于块的, 支持运动补偿和变换编码的混合编码方案。同样, 每个图像被分解为宏块 (16*16块), 并且任意大小的切片可将多个宏块分组为独立单元。
H.264 的详细介绍参见 H.264 视频编码简介
视频帧 Video Frame
视频是由一系列图像组成的动作序列, 并且该序列中的每个图像都将在要显示的动作序列的时间轴中接替前一个图像。 这些静止图像称为视频帧。
每个视频帧之间的时间差越小, 刷新率就越高, 并且视频中的运动表现得越自然。
这是因为每秒有更多的视频帧要显示为动作序列的一部分, 因此帧之间图像的变化较小, 并且运动看起来更平滑。
I-frame 信息帧
信息帧用帧内压缩, 用作关键帧
P-frame
预测帧 Predictive Frame 用帧间压缩, 反映之前的 I-frame 的变化
B-frame
双向预测帧 Bidirectional Predictive Frames 使得总体压缩更高, 它参考了之前的 I-frame 和之后的 P-frame
视频压缩 Video compress
由于视频是由图像的时间序列组成, 视频压缩可以看作具有时间分量的图像压缩。
大多数视频压缩方案都利用了时间相关性来消除冗余。
预测帧与当前帧之间的差异称为预测误差或残差
Intra-Frame 帧内压缩
Inter-Frame 帧间压缩
H.264
H.264 and MPEG-4 Video Compression: Video Coding for Next-generation Multimedia
视频是由一系列图像形成的动作序列, 并且该系列中的每个图像在要显示的动作序列的时间线中与前一个图像相继。 这些静止图像称为视频帧。 每个视频帧之间的时间差越小, 刷新率越高, 在视频中表现出的的移动越自然。 这是因为每秒生成的视频帧数量更多, 作为动作序列的一部分显示, 因此帧之间图像的变化更小, 移动看起来更平滑。
IDR
An encoder sends an IDR (Instantaneous Decoder Refresh) coded picture (made up of I- or SI-slices) to clear the contents of the reference picture buffer. On receiving an IDR coded picture, the decoder marks all pictures in the reference buffer as ‘unused for reference’. All subsequent transmitted slices can be decoded without reference to any frame decoded prior to the IDR picture. The first picture in a coded video sequence is always an IDR picture.
视频帧 Video Frame
视频是由一系列图像组成的动作序列, 并且该序列中的每个图像都将在要显示的动作序列的时间轴中接替前一个图像。 这些静止图像称为视频帧。
每个视频帧之间的时间差越小, 刷新率就越高, 并且视频中的运动表现得越自然。
这是因为每秒有更多的视频帧要显示为动作序列的一部分, 因此帧之间图像的变化较小, 并且运动看起来更平滑。
Compression and media resilliency feature
Error feedback mechanism
Enhanced motion estimation
Improved entropy coding
Intra-prediction coding for I-frame
4*4 Display Channel Table (DCT)
Network Abstraction Layer
Gradual Decoder Refresh(GDR) frame
Long-Term Reference Picture (LTRP) frame
错误反馈机制
增强的运动估计
改进的熵编码
I帧的帧内预测编码
4 * 4 显示频道表 (DCT)
网络抽象层
渐进式解码器刷新 (GDR)帧
长期参考图片 (LTRP)帧
图像识别
人类视觉系统的特点
人眼对低频内容比高频内容更敏感
低频内容: 像素值不会快速变化的平面区域
高频内容:具有边角和边缘的区域,像素值波动很大
人眼对亮度的变化比对颜色的变化更敏感
人眼对运动很敏感, 能快速感知是否有物体在移动
人脑会记下视野中的特征点, 以此作为识别物体的依据
Tools
sips
sips - scriptable image processing system. This tool is used to query or modify raster image files and ColorSync ICC profiles. Its functionality can also be used through the “Image Events” AppleScript suite.
sips -s format bmp input.jpg --out output.bmp