控制压缩率的原理
在JPEG压缩编码原理介绍中就知道整个JPEG压缩原理就是通过DCT变换去除空间冗余来达到图片压缩的。
如图1所示,经过DCT变换之后DCT系数只保留的左上角的数据(低频分量数据),右下角部分均变成0.
因此,想要进一步压缩就可以从量化表下手。
量化表的量化系数越大,得到的量化后的DCT系数就越小,高频信息消失的更多,图片容量就越小。
海思平台操作
控制JPEG编码参数的接口
HI_MPI_VENC_SetJpegParam
【描述】
设置JPEG协议编码通道的高级参数
【语法】
HI_S32 HI_MPI_VENC_SetJpegParam(VENC_CHN VeChn, const VENC_JPEG_PARAM_S *pstJpegParam);
【参数】
VENC_JPEG_PARAM_S
typedef struct hiVENC_JPEG_PARAM_S
{
HI_U32 u32Qfactor;
HI_U8 u8YQt[64];
HI_U8 u8CbQt[64];
HI_U8 u8CrQt[64];
HI_U32 u32MCUPerECS;
} VENC_JPEG_PARAM_S;
其中结构体VENC_JPEG_PARAM_S里的u32Qfactor是量化表因子,该因子范围为[1, 99],u32Qfactor 越大,量化表中的量化系数越小,得到的图像质量会更好,同时,编码压缩率更低。同理 u32Qfactor 越小,量化表中的量化系数越大,得到的图像质量会更差,同时,编码压缩率更高。具体的 u32Qfactor 与量化表的关系请见 RFC2435 标准。
因此量化表因子其实就是控制图像所保留高频分量的范围,如果想压缩更低,那就保留的高频分量信息就越少。
在实际应用中,如果对JPEG图片大小没有限制,一般会将u32Qfactor设置为99,这样能保证图像质量最好。但是如果在实际应用场景中,对图片的大小有明确的限制,例如图片必须小于1M,那是不是直接把u32Qfactor调到最小就好了呢?当然不是,通常我们的做法就是先从u32Qfactor从高往下调,每次编码结束后读取JPEG大小是否满足1M,如果不满足的话,那就再把u32Qfactor调小一些,知道满足大小为1M,而图像质量又能得到较好的保证。
参考文档:HiMPP V4.0 媒体处理软件开发参考.pdf
注意
目前的JPEG编码,如果配置的u32Qfactor过低,会导致编码出来的JPEG图片出现偏色等现象,原因是色度的量化步长过大。用户可以通过调用HI_MPI_VENC_SetJpegParam接口修改色度的量化表,限制色度的量化步长,避免偏色等现象。具体的u32Qfactor与量化表的关系请见RFC2435标准。修改色度的量化表有可能会导致JPEG图片容量变大,用于需要权衡图像质量和JPEG图像容量。