从webp图片格式谈起
发表于 : 2021-02-01 9:16
最近webp格式的图片好火爆啊,网上一片叫好声,我最近也一直在折腾它。说是它同时做到了高压缩比和高保真率,着实不简单呢,开始我是相信的,因为粗看webp格式和jpg格式的照片基本没有差别,至少没有偏色,色调没有可察觉的违和感。但仔细一看,webp格式的照片锐度有损失,原图的那种“清凉感”减弱了,画面比较油腻,“水头”很足。再一看,webp格式的图片还有很细的白色竖条纹:
原来高压缩比来自“偷工减料”,规律的白色竖条纹实际上起到了缩小画幅的作用,之所以让我们感觉画质损失不大是利用了我们大脑的脑补功能,我们的大脑总是有自动平滑不连续部分的倾向。比如下图的每个白线交叉点看起来都有一个灰色点儿再闪烁,那就是脑补的效果。
其实眼见为实这事儿很扯淡的,我们的视觉都是大脑处理视网膜收光线刺激触发的电信号后的结果,而大脑的主观能动性是很强的,也是有“算法”的。就像数码相机有数码芯片处理CCD或CMOS上的电信号,是会用算法插值锐化的,至于美颜手机拍的东西,那更是你高兴就好了。
进而我在想怎么利用目前算力强,带宽窄的特点,对图片传输做一些改进呢。我认为可以借鉴网页传送的技术,搞一些类似HTML的画面标记技术。举个例子:要处理一幅800X600像素的图片,我们把每一行作为一个处理单位,拟合三原色在宽度坐标上的强度曲线(尽量避免过拟合),做类似下图的傅里叶展开: 最后每行传一个首项常数和一个矩阵: 接收端收到这600个矩阵后,再还原成傅里叶级数,算出该行该列的颜色强度值,最后合成图像。当然,如果存在空白,或纯色的部分可以做成分段函数。也可以先按平缓程度和波动程度把曲线分成几段,分段拟合,以提高拟合度。最后在还原图像时对分段的地方做一些平滑处理。
如果我们只取级数前30项(精度已经足够了,因为像素深度本来就有限),那么一行单色最多需要传61个参数,比按像素传800个参数要压缩不少的,而且像素越多,尺幅越大的图片压缩比越大,保真率越高。这样做的目的就是充分利用发送端和接收端的算力,而缓解网络传输的拥堵,改善客户体验。另外,如果我们在火星等地外行星有了基地,更好地利用带宽进行联系,将是生死攸关的大事。
进而我在想怎么利用目前算力强,带宽窄的特点,对图片传输做一些改进呢。我认为可以借鉴网页传送的技术,搞一些类似HTML的画面标记技术。举个例子:要处理一幅800X600像素的图片,我们把每一行作为一个处理单位,拟合三原色在宽度坐标上的强度曲线(尽量避免过拟合),做类似下图的傅里叶展开: 最后每行传一个首项常数和一个矩阵: 接收端收到这600个矩阵后,再还原成傅里叶级数,算出该行该列的颜色强度值,最后合成图像。当然,如果存在空白,或纯色的部分可以做成分段函数。也可以先按平缓程度和波动程度把曲线分成几段,分段拟合,以提高拟合度。最后在还原图像时对分段的地方做一些平滑处理。
如果我们只取级数前30项(精度已经足够了,因为像素深度本来就有限),那么一行单色最多需要传61个参数,比按像素传800个参数要压缩不少的,而且像素越多,尺幅越大的图片压缩比越大,保真率越高。这样做的目的就是充分利用发送端和接收端的算力,而缓解网络传输的拥堵,改善客户体验。另外,如果我们在火星等地外行星有了基地,更好地利用带宽进行联系,将是生死攸关的大事。