RGB,YUV数据格式

YUV与RGB格式介绍

一、RGB编码格式

RGB图像具有三个通道 R、G、B,分别对应红、绿、蓝三个分量,由三个分量的值决定颜色;通常,会给RGB图像加一个通道alpha,即透明度,于是共有四个分量共同控制颜色。

一般情况下,RGB 图像中,每个像素点都有红、绿、蓝三个原色,其中每种原色都占用 8 bit,也就是一个字节,那么一个像素点也就占用 24 bit,也就是三个字节。如果是argb格式图像,1个像素点需要32 bit,也就是4个字节。

在图像显示中,一张 1280 * 720 大小的图片,就代表着它有 1280 * 720 个像素点。其中每一个像素点的颜色显示都采用 RGB 编码方法。一张 1280 * 720 大小的图片,就占用 1280 * 720 * 3 / 1024 / 1024 = 2.63 MB 存储空间。

二、YUV编码格式
YUV 相比于 RGB 格式最大的好处是可以做到在保持图像质量降低不明显的前提下,减小文件大小。TUV 格式之所以能够做到,是因为进行了采样操作。

YUV 颜色编码采用的是明亮度和色度来指定像素的颜色。。其中,Y 表示明亮度(Luminance、Luma),而 U 和 V 表示色度(Chrominance、Chroma)。

和 RGB 表示图像类似,每个像素点都包含 Y、U、V 分量。但是它的 Y 和 UV 分量是可以分离的,如果没有 UV 分量一样可以显示完整的图像,只不过是黑白的。

对于 YUV 图像来说,并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应自己的 UV 分量,也可以几个 Y 分量共用 UV 分量。

YUV和RGB的相同点:都是用来表达颜色的数学方法;

        YUV和RGB的相同点:对颜色的描述思路和方法不同。RGB将一个颜色拆解为3个纯色的亮度组合,YUV将一个颜色分解为一个亮度和2个色度的组合。

        那引入YUV这种色彩空间的好处具体有啥呢?

 1.   YUV提取Y亮度信号,可以直接给黑白电视使用,兼容黑白电视

 2.  人眼对UV的敏感性小于亮度,这样我们适当减少uv的量,而不影响人的感官。所以才会有多种格式的 YUV描述,如420、422、444。

3.  伴随显示设备分辨率的提升,bt组织也针对yuv2rgb设定了不同的系数,来最好的从YUV转换到RGB。

4.  YUV格式可以比RGB格式储存空间小。
 

常用图像像素格式 NV12、NV21、I420、YV12、YUYV

YU12格式(也称为I420格式)

                YU12是先Y再U后V。

                假如一个8*2像素的图像的该格式的存储分布如下图:

 

 

        YV12格式

                YV12是先Y再V后U

                假如一个8*2像素的图像的该格式的存储分布如下图:

NV12

                NV12是IOS中有的模式,它的存储顺序是先存Y分量,再UV进行交替存储。

                假如一个8*2像素的图像的该格式的存储分布如下图:

 

 

        NV21

                NV21是安卓中有的模式,它的存储顺序是先存Y分量,在VU交替存储。

                假如一个8*2像素的图像的该格式的存储分布如下图:

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将 YVU420SP 格式的图像转换为 YUV 数据格式,然后再将 YUV 数据转换为 RGB 数据格式,并最终将 RGB 数据写入图像文件,您可以使用以下代码: ```cpp #include <opencv2/opencv.hpp> int main() { // 读取 YVU420SP 格式的图像 cv::Mat yvuImage = cv::imread("input.yvu", cv::IMREAD_UNCHANGED); // 提取 Y 分量 cv::Mat yImage(yvuImage.rows, yvuImage.cols, CV_8UC1); cv::extractChannel(yvuImage, yImage, 0); // 提取 U 和 V 分量 cv::Mat uvImage(yvuImage.rows / 2, yvuImage.cols, CV_8UC2); cv::extractChannel(yvuImage, uvImage, 1); // 合并 U 和 V 分量,形成 YUV420P 数据 std::vector<cv::Mat> yuvChannels = {yImage, uvImage}; cv::Mat yuvImage; cv::merge(yuvChannels, yuvImage); // 将 YUV420P 数据转换为 RGB 数据 cv::Mat rgbImage; cv::cvtColor(yuvImage, rgbImage, cv::COLOR_YUV2BGR_I420); // 保存转换后的 RGB 图像 cv::imwrite("output.jpg", rgbImage); return 0; } ``` 在上述代码中,我们首先使用 `cv::imread` 函数读取一个 YVU420SP 格式的图像(例如,名为 "input.yvu" 的文件)。然后,我们使用 `cv::extractChannel` 函数分别提取 Y、U 和 V 分量。接下来,我们将 U 和 V 分量合并为一个 `cv::Mat` 对象 `yuvImage`,形成 YUV420P 数据。最后,我们使用 `cv::cvtColor` 函数将 YUV420P 数据转换为 RGB 数据,并使用 `cv::imwrite` 函数将转换后的 RGB 图像保存为图像文件(例如,名为 "output.jpg" 的文件)。 请注意,上述代码中的文件路径和名称需要根据实际情况进行修改,并且需要正确安装和链接 OpenCV 库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值