NV12格式定义了YUV颜色空间的特定颜色通道顺序,共有420个子采样。
NV12格式主要用于视频编解码流水线。在
NV12 is a biplanar format with a full sized Y plane followed by a single chroma plane with weaved U and V values. NV21 is the same but with weaved V and U values. The 12 in NV12 refers to 12 bits per pixel. NV12 has a half width and half height chroma channel, and therefore is a 420 subsampling.
在NV12环境中,YUV格式主要指YCbCr颜色空间。
NV12元素为每个元素8位(uint8
类型)。
在帖子的上下文中,YUV元素是在“有限范围”的标准:Y范围是[16235],U,V范围是[16240]。在
sRGB是PC系统使用的标准颜色空间。
在post上下文中,sRGB颜色分量的范围是[0255](uint8
类型)。
RGB元素排序与post无关(假设3个颜色平面)。在
目前至少有2种可能的YCbCr格式适用于NV12:
NV12元素排序示例:YYYYYY
YYYYYY
UVUVUV
RGB到NV12的转换可以通过以下阶段来描述:
下图说明了应用6x6像素的图像大小的转换阶段:
如何使用NumPy将sRGB转换为NV12?
注意:
这个问题涉及到演示转换过程的Python实现(post不适用于OpenCV实现等现有函数)。在
使用NumPy将sRGB转换为NV12格式
帖子的目的是演示转换过程。
下面的Python实现使用NumPy,并故意避免使用OpenCV。在
RGB到NV12转换级:
使用sRGB到YCbCr的转换公式。
将每个RGB三倍乘以3x3转换矩阵,并添加一个3个偏移量的向量。
帖子显示了BT.709和BT.601的转换(唯一的区别是系数矩阵)。在
该实现使用双线性插值将U、V的大小调整为每个轴的0.5倍。
注:双线性插值不是最佳的下采样方法,但通常足够好。
代码不使用
cv2.resize
,而是使用每2x2像素的平均值(结果相当于双线性插值)。注意:如果输入解析在两个维度上都不均匀,则实现失败。在
通过数组索引操作实现。在
以下是将RGB转换为NV12标准的Python代码示例:
示例RGB输入图像:
![RGB input](https://i.stack.imgur.com/6e09U.png)
NV12结果(显示为灰度图像):
![NV12 output as Grayscale](https://i.stack.imgur.com/xELQb.png)
相关问题 更多 >
编程相关推荐