YUV格式总结

YUV格式总结

格式说明

YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。
YUV 分别由一个称为 Y(相当于灰度)的“亮度”分量(Luminance or Luma)和两个称为 U(蓝色投影 Cb)和 V(红色投影 Cr)的“色度”分量(Chrominance or Chroma)表示,由此得名。交换UV后会发现图片中的红色和蓝色被交换了。

仅有 Y 分量而没有 UV 分量信息,一样可以显示完整的黑白(灰度)图像,解决了模拟信号电视黑白与彩色的兼容问题。

常用分类方法

根据三个分量Y、U、V采样率不同,常常可以分成:yuv444、yuv422、yuv420、yuv411。

  • yuv444 表示不降低色度(UV)通道的采样率。每个 Y 分量对应一组 UV 分量。
  • yuv422 表示 2:1 水平下采样,没有垂直下采样。每两个 Y 分量共享一组 UV 分量。
  • yuv420 表示 2:1 水平下采样,同时 2:1 垂直下采样。每四个 Y 分量共享一组 UV 分量。
  • yuv411 表示 4:1 水平下采样,没有垂直下采样。每四个 Y 分量共享一组 UV 分量。

存储格式

YUV格式的存储格式分三种:

  • Packed打包格式:yuv分量交错存储
  • Plannar平面格式:yuv分量分三个平面存储
  • Semi-Planar半平面格式:y分量uv分量分两个平面,uv平面交错存储

存储分布图

在这里插入图片描述

看完分布很好理解三种存储格式,常用的YUV存储分布图如下:

YUV420plannar

图片大小与宽高关系:size = widthxheighx1.5
I420也叫YU12或IYUV

/*I420内存分布
              w
    +--------------------+
    |Y0Y1Y2Y3...         |
    |...                 |   h
    |...                 |
    |                    |
    +--------------------+
    |U0U1      |
    |...       |   h/2
    +----------+
    |V0V1      |
    |...       |  h/2
    +----------+
        w/2
 */

YV12, UV的排布和I420相反

/*
YV12内存分布   w
    +--------------------+
    |Y0Y1Y2Y3...         |
    |...                 |   h
    |...                 |
    |                    |
    +--------------------+
    |V0V1      |
    |...       |   h/2
    +----------+
    |U0U1      |
    |...       |  h/2
    +----------+
        w/2
*/

YUV420sp

图片大小与宽高关系:size = widthxheighx1.5
NV12和NV21是半平面存储格式,二者区别只是U、V所在平面相反

/*NV12内存分布
                      w
            +--------------------+
            |Y0Y1Y2Y3...         |
            |...                 |   h
            |...                 |
            |                    |
            +--------------------+
            |U0V0U1V1            |
            |...                 |   h/2
            +--------------------+
*/
/*
NV21内存分布		   w
            +--------------------+
            |Y0Y1Y2Y3...         |
            |...                 |   h
            |...                 |
            |                    |
            +--------------------+
            |V0U0V1U1            |
            |...                 |   h/2
            +--------------------+
*/

格式转换

YUYV转I420

void YUYVConvertI420(int width,int hight,char *pYUYV,char *pI420)
{
    char *u = pI420+hight*width;
    char *v = u+hight*width/4;
    int i=0,j=0;
    for (i = 0; i <hight/2;i++) {
        char *src_l1=(pYUYV+width*2*2*i);
        char *src_l2=(src_l1+width*2);
        char *y_l1=pI420+width*2*i;
        char *y_l2=y_l1+width;
        for(j=0;j<width/2;j++)
        {
            *y_l1++=src_l1[0];
            *u++=src_l1[1];
            *y_l1++=src_l1[2];
            *v++=src_l1[3];
            *y_l2++=src_l2[0];
            *y_l2++=src_l2[2];
            src_l1+=4;
            src_l2+=4;
        }
    }
}

I420转NV12

void I420ConvertNV12(unsigned char* pI420, unsigned char* pNV12, int width, int height)
{
    int i, j;
    int y_size = width * height;
    unsigned char* y = pI420;
    unsigned char* u = pI420 + y_size;
    unsigned char* v = pI420 + y_size * 5 / 4;
    unsigned char* y_tmp  = pNV12;
    unsigned char* uv_tmp = pNV12 + y_size;
    // y
    memcpy(y_tmp, y, y_size);
    // u
    for (j = 0, i = 0; j < y_size/2; j+=2, i++)
    {
		// 此处可以调整UV位置,根据需要调整为NV12或NV21
        uv_tmp[j] = u[i];
        uv_tmp[j+1] = v[i];
        // 下面是转NV21的
        // uv_tmp[j] = v[i];
        // uv_tmp[j+1] = u[i];
    }
}

NV21转NV12

void NV21ConvertNV12(int width,int height,char *pNV21,char *pNV12)
{
    memcpy(pNV12, pNV21, width*height);//y分量
    int i;
    for(i=0; i<width*height/2; i++){
        memcpy(pNV12+width*height+i+1, pNV21+width*height+i, 1);//u分量
        memcpy(pNV12+width*height+i, pNV21+width*height+i+1, 1);//v分量
    }
}

图像裁剪

NV12的裁剪处理

// >>替代/运算,提高转换效率
void NV12CropHandle(unsigned char *tarYuv, unsigned char *srcYuv, int startW, int startH, int cutW, int cutH, int srcW, int srcH)
{
    int i;
    int j = 0;
    int k = 0;
    unsigned char *tmpY  = tarYuv;
    unsigned char *tmpUV = tarYuv + cutW*cutH;
    unsigned int limitY  = cutH+startH;
    unsigned int limitUV = (cutH+startH)>>1;
    for(i=startH; i<limitY; i++) {
        // 逐行拷贝Y分量,共拷贝cutW*cutH
        memcpy(tmpY+j*cutW, srcYuv+startW+i*srcW, cutW);
        j++;
    }
    for(i=(startH>>1); i<limitUV; i++) {
        //逐行拷贝UV分量,共拷贝cutW*cutH/2
        memcpy(tmpUV+k*cutW, srcYuv+startW+srcW*srcH+i*srcW, cutW);
        k++;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: YUV格式的图像通常是用于视频处理的,其中Y表示亮度分量,U和V表示颜色分量。这种图像格式在计算机视觉、数字信号处理、视频压缩等领域中广泛使用。下面介绍几种常见的打开YUV格式图像的方法。 1. 使用视频播放器:常见的视频播放器如Potplayer、VLC等都支持打开YUV格式的图像文件,只需将文件拖动到播放器窗口即可打开。 2. 使用Matlab:Matlab是一种常见的科学计算软件,也可以用于图像处理。在Matlab中打开YUV格式图像需要使用`yuvread()`函数,该函数可以读取和显示YUV格式的文件。 3. 使用Python:Python是一种常见的编程语言,也可以用于图像处理。使用Python打开YUV格式图像需要使用相应的库,如OpenCV或PyAV等,同时需要编写相应的代码实现图像的读取和显示。 无论是使用视频播放器、Matlab还是Python,打开YUV格式图像都需要注意一些细节。例如,需要确定图像的尺寸和颜色空间,不同的YUV格式可能会有不同的解码方式,需要根据具体的需要进行相应的设置和调整。 ### 回答2: YUV是一种用于存储图像或视频的格式,在计算机图形和多媒体处理中应用广泛。下面是一个简单的步骤,告诉您如何打开YUV格式的图像。 首先,您需要一个图像查看器或多媒体播放器,它支持YUV格式。一些常见的软件包括VLC媒体播放器、PotPlayer、Photoshop和FFmpeg工具等。 其次,确保您已经将需要打开的YUV文件保存在计算机的某个位置。通常,YUV图像文件的扩展名为.yuv。 接下来,打开您选择的图像查看器或多媒体播放器。对于VLC媒体播放器,您只需点击"媒体"菜单中的"打开文件"选项,然后选择要打开的YUV文件。 对于PotPlayer,您可以使用类似的方法。单击"文件"菜单,然后选择"打开"选项,找到YUV文件并点击"打开"。 如果您想使用Photoshop打开YUV文件,可以选择文件菜单中的"打开"选项,并选择YUV文件。在打开对话框中,您还可以选择将其打开为灰度图像、RGB图像或其他特定颜色空间的图像。 另外,您还可以使用FFmpeg工具在命令行中打开YUV文件。您可以编写一个简单的命令,指定输入文件和所需的输出格式。例如,"ffmpeg -s 1920x1080 -i input.yuv output.png"可以将YUV文件转换为PNG图像。 最后,一旦您成功打开了YUV格式的图像文件,您可以使用相应的软件进行浏览、编辑、处理或转换等操作,以满足您的需要。 总而言之,打开YUV格式图像需要一个支持该格式的软件,并根据软件的指导打开文件。 ### 回答3: YUV格式是一种用于存储彩色图像的文件格式,常用于视频压缩和流媒体传输。要打开YUV格式的图像,可以按照以下步骤进行。 首先,需要一个支持YUV格式的图像编辑软件或播放器。常见的软件包括Adobe Premiere、VirtualDub和VLC媒体播放器等。在电脑上安装这些软件后,可以直接打开YUV文件。 另外,还可以通过使用YUV转换工具将YUV文件转换为其他常见的图像格式,例如JPEG或PNG。这些转换工具可以在互联网上找到,并且有多个免费和付费的选项可供选择。 打开YUV格式图像时,可以选择加载整个图像或者仅选择加载其中的部分区域。然后,可以使用软件提供的功能来编辑图像,如调整亮度和对比度、改变颜色饱和度、添加滤镜效果等。 需要注意的是,YUV格式图像通常由分为亮度(Y)和色度(UV)两个分量组成,因此在查看或编辑YUV图像时,确保正确理解和处理这些分量是非常重要的。 总结起来,要打开YUV格式图像,可以通过使用支持YUV格式的软件或转换工具,或者将文件转换为其他常见的图像格式来实现。在打开和处理YUV图像时,需要注意其分量的特性,以便正确对图像进行查看和编辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值