图像压缩与离散余弦变换
把图像看作如100x100个像素,每个像素红绿蓝3个灯泡,是直观的。
RGB可以转换成YUV亮度和颜色。YUV和RGB来回转换不丢失信息,也不能压缩。人眼对亮度比对颜色敏感,比如灯光昏暗时分辨不出颜色。每2个或4个点共用颜色信息,如(100, 101, 98, 99)用100来表示,就可以压缩图像(和损失质量)。
YUV三个平面plane,都是数,比如用0到255的整数来表示。对它们的处理方式是一样的。8x8的块/二维数组,每个数组元素都是个0~255的整数。可以把二维数组压扁成一个8x8=64的一维数组,y轴表示亮度Y,x轴表示0~63,就可以画出个波形,或者说图像变成了信号。也许亮度随x和y的变化可以用三维空间里的曲面表示,再求求偏导数。
傅里叶变换也许可以叫连续正弦变换,用一堆频率/周期不同的正弦波叠加起来,sin(x)前乘的系数不同,只要正弦波的数量足够多,就可以叠加出来任意波形。回到主题,首先0~63的变化是不连续的,如x轴上没有1.6, 2.7这样的点。其次正弦曲线平移可得到余弦曲线,于是就有了离散余弦变换。一般说时域到频域的变换。当x轴是时间,y轴是音量时,这个叫法非常贴切。信号处理是比图像处理更广泛的概念。
离散余弦变换和反(向)离散余弦变换类似于RGB和YUV互转,也是无损失无压缩的。关键是对频率不同的分量信号使用不同的量化级数。0,1,2,3,都用0代替,4,5,6,7,都用1代替是量化的一个例子。量化得"越狠",压缩比就越高。如极端例子都是0,用64和0两个数即可表示/传输/记录64个0。0~63都出现了,又没有规律,就不好压缩了。
比如有张美人脸的图片 :-)。脸蛋的颜色是直流分量,频率最低。腮红是频率比直流高的分量。高频分量么,眼线笔描变眼影刷涂,不细看注意不到,高频分量狠狠地量化,就可以压缩图像了。好像还得之字形排列一下,才容易出来连续的0,而不是0 1 0 1 0 0 之类。
胡说完了八道:64个输入,可以固定用64个频率不同的cosine,高频的丢掉。每个cosine的系数是未知数,把每个点代入,得到64个64元一次方程。除了解方程外,还可以不需要去方程左右相等,约等即可。反向离散余弦变换IDCT也是乘来加去。并不是TPU就比CPU厉害了,TPU做除法运算吗?CPU是通用的。