3、图像编码原理:JPEG压缩原理、H.264/H.265编码对比、编码参数对带宽的影响

做机器视觉的,尤其是搞设备联网的,图像编码这块是绕不开的坎。我刚开始接触这个领域时,总觉得压缩就是“把图变小”,后来踩了不少坑才明白——编码选不对,带宽全白费

今天咱们就聊聊三个核心问题:JPEG怎么压的?H.264和H.265到底差在哪?编码参数又是怎么吃掉你的带宽的?

3.1 JPEG压缩原理:别小看这张“老照片”

JPEG虽然是个老古董了,但在工业相机里,它依然是主力。为什么?因为它简单、稳定、硬件支持好。

JPEG压缩的核心思路,说白了就是“骗眼睛”。人眼对亮度敏感,对颜色不敏感;对低频敏感,对高频不敏感。JPEG就抓住这个弱点下手。

具体流程分四步:

  1. 颜色空间转换:把RGB转成YCbCr。Y是亮度,Cb和Cr是色度。这一步就把人眼不敏感的颜色信息单独拎出来了。
  2. 下采样:对色度通道进行压缩。常见的是4:2:0,也就是色度信息只保留1/4。你想想看,人眼根本看不出区别,但数据量直接砍半。
  3. DCT变换 + 量化:这是核心。把图像分成8x8的小块,做离散余弦变换,把空间域的像素值转成频率域的系数。然后用量化表去“舍掉”那些高频细节。量化表越粗糙,压缩比越高,画质越差。
  4. 熵编码:最后用哈夫曼编码把数据再压一遍。

关键点:JPEG的压缩比通常在10:1到20:1之间。我做过测试,一张1920x1080的原始BMP图大约6MB,JPEG压到300KB左右,肉眼几乎看不出区别。但如果你把压缩质量设到10%,那画面就全是马赛克了。

我的经验:在设备联网场景下,JPEG适合做单帧抓拍。比如产线上偶尔拍一张做质检,JPEG完全够用。但如果是视频流,JPEG就扛不住了——每帧独立压缩,帧间冗余一点没利用,带宽浪费严重。

3.2 H.264 vs H.265:视频编码的“两代王者”

做视频传输,H.264和H.265是绕不开的。我当年从H.264切到H.265时,第一反应是“这玩意儿真香”。

先看对比表格:

对比项 H.264 (AVC) H.265 (HEVC)
编码效率 基准 提升40%~50%
同画质码率 4Mbps 2Mbps
计算复杂度 高(约2~3倍)
硬件支持 几乎所有设备 较新设备才支持
专利费用 成熟,费用明确 专利池复杂,有风险
适用场景 老旧设备、低算力平台 新项目、高压缩需求

为什么会差这么多?核心在于H.265引入了更聪明的编码单元划分。H.264的宏块固定是16x16,而H.265可以从64x64一直细分到4x4。你想想看,大块平坦区域用大块编码,细节区域用小块编码,效率自然高。

另外,H.265的运动估计也更强。它支持非对称运动划分、更精细的亚像素插值。说白了,就是“找相似块”找得更准了。

注意:H.265虽然省带宽,但解码压力大。我曾经在一个项目里用海思3516跑H.265编码,1080p@30fps没问题。但换到一款低端ARM芯片上,解码直接卡成PPT。所以选型时一定要算好算力余量。

3.3 编码参数对带宽的影响:调参是个技术活

很多新手以为编码就是“选个格式,设个码率”就完事了。其实不然。编码参数对带宽的影响,比你想象的大得多。

我列几个关键参数,你感受一下:

  • 码率控制模式:CBR(恒定码率)还是VBR(可变码率)?CBR适合带宽固定的场景,但画质波动大。VBR画质稳定,但码率会跳。我个人习惯在设备联网场景下用VBR,配合一个最大码率限制。
  • GOP大小:也就是I帧间隔。I帧越大,压缩比越高,但随机访问能力越差。我一般设30~60帧一个I帧。如果网络丢包严重,可以缩短到15帧。
  • 量化参数(QP):QP越低,画质越好,码率越高。QP每增加6,码率大约减半。我调试时通常从QP=23开始,根据画面复杂度微调。
  • 分辨率与帧率:这个不用多说。分辨率降一半,码率降一半。帧率降一半,码率也降一半。但要注意,帧率太低会导致画面卡顿,工业场景下至少25fps。

实战数据:我用H.265编码,1080p@30fps,QP=28,GOP=30,实测码率大约1.5~2.5Mbps。同样的参数换成H.264,码率直接飙到3~4Mbps。这就是为什么现在新项目我首选H.265。

避坑指南:我曾经在一个项目中,为了省带宽把QP设到40,结果画面全是块状噪声,算法直接识别失败。后来我学乖了——编码参数一定要和算法需求对齐。如果算法需要高纹理细节,QP就别超过30。

最后说一句,编码参数没有“万能配方”。每个场景都要调。我的做法是:先固定分辨率帧率,然后调QP和GOP,用码率监控工具实时看效果。调个两三轮,基本就能找到平衡点。

嗯,图像编码这块,说白了就是在画质、带宽、算力之间找平衡。没有最好的编码,只有最适合你场景的编码。