矢量图、位图、RGB、YUV、JPEG、PNG的理解

版权声明:本文为博主原创文章,转载请注明出处: https://blog.csdn.net/kcstrong/article/details/81705693

开发的项目中缺少不了图形图像的支持,对图的使用场景也是极多的,但对其内部原理却一直处理模糊状态,抽时间做个整理吧,理一下相关的概念。

一、矢量图与位图

矢量图与位图均为图像的表述方式,矢量图可以理解为在我们口中描述图形的方法,比如:图A:一个半径10cm的绿色实心圆,重点包括:圆、实心、绿色、半径为10cm、圆心位置,这些信息只需要很少的字节即可记录图A,因而,矢量图所占空间较小;还有一个特点就是放大以后不会变形,因为不管放多大,其特征都是固定的。矢量图缺点也很明显,难以表述复杂场景。基于矢量图放大不变形的特点,目前有一个重要的应用场景是电子地图。

位图的基本单元为像素,位图即是像素的集合,具体到某一张平面图片,将其量化为width*heigh的像素矩阵,每个像素使用一定的规则(RGB或YUV,稍后细述)进行表述,得到整个图片的二进制文件格式即为位图。不经过处理的位图持有原图的全部数字化信息,图片文件比矢量图要大很多。

二、RGB

位图的每个像素可以用RGB格式表述,RGB也是像素点色彩值的最直观表述,常用的RGB包括RGB565、RGB888,表示不同的量化级别,以RGB888为例,分别采用8个bit表示红色、蓝色和绿色,各色值的量化范围为[0,255],可以表述2^24个色值。一幅720*1080的图片如果用RGB888表述的话大小为:720*1080*3=2M左右,文件较大,一般都要进行压缩处理。当前大部分的压缩处理算法是不是基于RGB的,而是针对YUV的。还有一种ARGB格式,在RGB的基础上,加上了Alpha通道,可以处理图片的透明部分。

三、YUV

RGB是把图片的每一个像素值用RGB的格式进行表述,YUV是另一种表述格式,也是针对每一个像素的,提取像素的亮度(Y分量)、色差(UV分量)。RGB的存储中,每个像素的R分量G分量B分量是挨着存放的,而YUV则是分为Y块、U块、V块三个矩阵,人眼最敏感的Y块全量保留,UV分块则可进行压缩处理。YUV的格式包括:YUV444、YUV422、YUV420、YUV411,表示不同的压缩比例,YUV444为源像素值。怎么理解呢,看下述步骤:

首先,取相领的2*2的四个像素

[Y1,U1,V1][Y2,U2,V2]

[Y3,U3,V3][Y4,U4,V4]

YUV444即为上述的四个值全部保留,YUV各占1Byte,四个像素所需空间为4*3=12B

YUV422为U值两个像素取一个、V值也是两个像素取一个,结果为:

[Y1,U1,V2][Y2,U1,V2]

[Y3,U3,V4][Y4,U4,V4]

四个像素所占空间为4*2=8B

YUV411四个像素使用一个像素的UV分量,编码结果为:

[Y1,U1,V3][Y2,U1,V3]

[Y3,U1,V3][Y4,U1,V3]

所占空间为4*3/2=6Byte

YUV420并非不要V分量,而是以行为单位,一行取U值,一行取V值

扩展一下源像素,第三、四行为:

[Y5,U5,V5][Y6,U6,V6]

[Y7,U7,V7][Y8,U8,V8]

YUV420的编码结果为:

[Y1,U1,无][Y2,U1,无]

[Y3,U3,无][Y4,U3,无]

[Y5,无,V5][Y6,无,V5]

[Y7,无,V7][Y8,无,V7]

8个像素所占空间为8*3/2=12Byte,4个像素的话为6B

一幅720*1080的图片YUV420格式的大小为:720*1080*3/2=1M左右,是RGB的一半。

RGB与YUV的转换公式:

矩阵形式:

          

要注意的是在写代码实现上,两者的存储方式不同,RGB连在一起,YUV分块存放。

四、JPEG

JPEG是一种有损压缩格式,其压缩比可达1:100,一般在1:10左右,右侧的值越大,文件越小,但清晰度也越低,其算法 的实现原理有非常多的文章描述的很清楚了,也不是很复杂,下面是我看到的几篇比较好的,推荐给大家:

中文:

https://blog.csdn.net/newchenxf/article/details/51719597/

https://blog.csdn.net/asdzheng/article/details/51779038

英文资料中维基上的就很全:

https://en.wikipedia.org/wiki/JPEG

总体说来,先压缩UV分量,然后分别对Y、U、V块进行离散余弦变换,将变换完的矩阵使用量化矩阵(和压缩比有关系)进行量化,Z字形拉平矩阵,哈夫曼编码。

五、PNG

PNG是一种无损压缩格式,也就是说经过PNG编码后的图像解码后可以保留源文件全部信息。当然,这个只是理论的,在实际算法中,与PNG支持的色度有关,比如,PNG表示一个颜色值使用8bit,则可以表示256种颜色,也就是说编码及解码可以达到256种颜色的还原,24位的PNG和RGB的精确度是一致的。PNG算法压缩原理利用的是图像相邻的色值有大面积重复部分,比如说,拍摄的蓝天白云,其蓝天部分的色值重复率就很高。PNG算法中首先按图像从左到右、从上到下获得各像素点的色值,然后在表示色值M之前会加一个重复个数的值N,表示该M色值往后N位全就都是M色值,N最大可表示的值取决于重复个数的二进制位,比如8位,最多可表示256个重复值,超过256,即使仍然是相同颜色,也要需要新起色值表示,这样重复色块就合并成数量+色值的表示,从而达到压缩效果。图像重合块越多,PNG的压缩效果就越好。

猜你喜欢

转载自blog.csdn.net/kcstrong/article/details/81705693