[图像处理] YUV图像处理入门1
目前数字图像处理技术已经应用生活各个方面,但是大部分教程都是利用第三方库(如opencv)对RGB图像格式进行处理。对于YUV图像格式的图像处理教程较少。于是博主搬运总结了多个大牛的文章,总结出来这个YUV图像像素处理入门教程。
这些大牛有:
雷霄骅(祝愿雷神在天堂安好)
https://blog.csdn.net/leixiaohua1020/article/details/50534150
其他两位朋友:
https://www.jianshu.com/p/8d60ad489bf4
https://github.com/kayawari/YUVProcessing/tree/master/sources
YUV图像空间简介
人们为了描述颜色,提出了多种颜色空间。常用的RGB颜色空间、YUV颜色空间、HSV颜色空间。被描述的颜色本身是客观独立的,不同的颜色空间只是从不同的角度去描述同一种对象。具体了解不同颜色空间可以看看这两篇文章:
https://www.cnblogs.com/xujianqing/p/5876875.html
https://www.cnblogs.com/justkong/p/6570914.html
总而言之,YUV颜色空间主要从亮度Y,色度U、浓度Y来描述颜色,其实亮度Y也可以理解成RGB图像中的灰度值。YUV颜色空间主要在多媒体流中使用较多。YUV空间最大的特点就是图像的亮度Y和色度UV是分离的。通常人对色度UV的敏感性要小于对亮度Y的敏感性。所以通常都会对UV进行压缩,甚至没有UV分量一样可以显示完整的图像。当只有Y分量的时候,图像表示为灰度图。
根据对UV压缩的程度不同和YUV的排列方式,人们提出了多种不同的YUV格式描述。要分析YUV图像,必须搞清楚到底所使用的YUV格式类似和图像大小。YUV格式具体可以参考这篇文章:
https://blog.csdn.net/asahinokawa/article/details/80596655
本教程主要针对yuv420P(又称I420)格式进行图像处理,其他YUV格式图像处理操作类似。yuv420P是较为常用的一种YUV图像格式。其内存结构图见下图。yuv420p它是先存完Y,再存U,最后存放V。YUV数量的比例为4:1:1。可以这样理解yuv420P,Y对应宽为w,高为h的图像,U和V对应宽为w/2,高为h/2的图像。因此描述一张高为h,宽的h图像,yuv420P所需空间大小为wh3/2个字节,而RGB空间通常需要wh3个字节。对于视频流传输YUV只需占用极少的频宽,学会对YUV格式图像进行处理是非常有用的。
YUV播放器
需要专用的YUV播放器展示YUV图像,最常用的YUV播放器是YUV Player Deluxe,下载地址为:
YUV Player Deluxe是一个免费的YUV文件播放器,但是需要实现注册。注册方法见该文章:
https://blog.csdn.net/lesen14/article/details/53178487
YUV图像以视频流的形式表示,由于在YUV格式的视频流中没有相关文件结构的信息,需要实现设置YUV的格式、帧宽、帧高以及帧率。展示视频akiyo,宽高为352,288,格式为yuv420P如下图所示:
在YUV Player
Deluxe可以单独查看YUV各个分量的图像,当Y分量宽高为352,288;UV分量宽高为176,144。U、V分量在YUV播放器中也是当成Y分量进行播放的。
YUV图像处理所需知识
对YUV图像处理通常都是基于C/C++语言,也有人通过java,python实现。一般不需要使用任何第三方库,在本教程最后会介绍libyuv,ffmpeg等第三方库的使用。本教程主要是在vs2017下基于C语言进行YUV图像处理进行处理,会涉及C++少量知识,但是尽量不用C++,C++坑太多。
主要用到的C/C++标准库函数有:
fopen(文件打开函数);fread(读数据流函数);fwrite(写数据流函数);malloc(动态内存分配函数),malloc函数需要与free函数连用;fseek(重定义指针位置函数);还有new,delete函数,类似malloc,free函数。
所用视频样本为akiyo视频,涉及的图像分辨率主要有Qcif(176144)、CIF(352288)、D1(704*576)三种。
文章结构及代码
本文主要介绍了12种yuv基本图像处理操作,在接下来四篇文章进行讲述,主要涉及yuv图像的通道分离,图像截取,转换为rgb图等知识。链接如下:
文章所用到的代码、视频以及运行结果见:
本文来自博客园,作者:落痕的寒假,转载请注明原文链接:https://www.cnblogs.com/luohenyueji/p/16991197.html