编程操作YUV像素

Posted 是光哥呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程操作YUV像素相关的知识,希望对你有一定的参考价值。

一、概述

YUV是一种图片格式(如jpg、bmp),常用于视频及图像处理中。
YUV为三个分量。“Y”表示亮度(Luminance或Luma),也就是灰度值。“U”和“V” 表示的是彩色信息,分别为色度和浓度(Chrominance和Chroma)。

二、YUV比较常见的图像格式

以256*256分辨率为例

1、YUV444

Y:U:V比例等于4:4:4,即1:1:1
256256个Y
256
256个U
256*256个V

2、YUV420P

Y:U:V=4:1:1
256256个Y、128128个U 、128*128个V
排列方式为YYY…YYYUUU…UUUVVV…VVV

3、YUV420SP

Y:U:V=4:1:1
256256个Y、128128个U、128*128个 V
排列方式为YYY…YYYUVUVUV…UVUVUV
但是UV排列方式和YUV420P的不一样,是UVUVUV交替

打开YUV图片需要特殊工具,可进入链接自行下载
YUV打开工具:链接.
在这里插入图片描述

三、对YUV像素进行编程操作

以这幅图为例,对图片进行亮度减半(即Y分量减半,Y变成1/2)
YUV420P
Y:U:V=4:1:1
256256Y 128128U 128128V
YYY…YYYUUU…UUUVVV…VVV
大小为256
256+128128+128128=二分之三*(256*256)

程序思路

1.取出文件里面的内容
2操作文件里面的内容
3.把文件里面的内容写到另一个文件里

#include <stdio.h>
#include <stdlib.h>

int main()
{
        FILE *fp1=NULL;
        FILE *fp2=NULL;
        int i = 0;

        unsigned char *readbuff;
        readbuff=(unsigned char *)malloc(256*256*3/2);

        fp1=fopen("lena_256x256_yuv420p.yuv","rb+");/*读取文件内容*,rb+读写打开一个二进制文件只允许读写数据*/
        fp2=fopen("new_256x256_yuv420p.yuv","wb+"); /* 读取完文件写入到另一个文件*/

        fread(readbuff,1,256*256*3/2,fp1);

        for(i=0;i<256*256;i++)
        {
                readbuff[i]=readbuff[i]/2;
        }

        fwrite(readbuff,1,256*256*3/2,fp2);

        return 0;
}

在这里插入图片描述
在Linux上进行编译运行,运行完成之后打开新生成的图片,可看到对比原来的图片亮度已经减半
在这里插入图片描述

以上是关于编程操作YUV像素的主要内容,如果未能解决你的问题,请参考以下文章

编程操作YUV像素

像素格式

从 YUV 字节数组中获取像素矩阵

YUV420P的像素数据编码为H.264的压缩编码数据

YUV420P的像素数据编码为H.264的压缩编码数据

FFmpeg基础: YUV像素格式介绍和使用