原文 | https://mp.weixin.qq.com/s/TXbcQoXw2HGkP3tnvKEpMQ数组
基变换的一个重要应用是压缩,图像、视频、音频和其它一些数据都会由于基变换而获得更高效的压缩存储。线性变换能够脱离坐标系,而描述线性变换的矩阵却要依赖于坐标系,所以选择合适的基会更便于计算。微信
因为景物各点的颜色及亮度不一样,摄成的黑白照片上或电视重现的黑白图像上各点呈现不一样程度的灰色。把白色与黑色之间按对数关系分红若干级,称为“灰度等级”。范围通常从0到255,白色为255,黑色为0,故黑白图片也称灰度图像,在医学、图像识别领域有很普遍的用途。网络
灰度使用黑色调表示物体,即用黑色为基准色,用不一样饱和度的黑色来显示图像。每一个灰度对象都具备从 0%(白色)到100%(黑色)的亮度值,下图中每一个方块都表明了一个不一样的亮度值:学习
咱们一般讲的“黑白照片”是一种灰度图像,它与计算机领域中的黑白照片不一样,在计算机图像领域中黑白图像只有黑和白两种颜色,而灰度图像在黑色与白色之间还有许多级的颜色深度:spa
考虑一副515×512像素的灰度静态图像,它有28×28个像素,每一个像素的灰度值是从0到255,用8bit空间存储。能够用矩阵存储数字图像,每一个元素都是一个像素点:3d
咱们也能够将一幅图像当成一个有515×512个份量的向量:code
v是一个R512×512空间的向量,它的前512个份量是A的第一列,第二个512个份量是A的第二列。这样一来,一个图像就能够看做是一个向量(这里的意思是,在计算时,把一个二维数组转换成一维数组处理,但存储上未必使用一维数组)。若是图像是彩色的,那么每一个像素点都须要存储三个数据(RGB),存储空间将是灰度图像的三倍。视频
存储图像将会占据大量的空间,若是不进行压缩,势必会影响系统的加载或网络传输效率。一种标准的图像压缩方式是JPEG(联合图像专家组,Join Photographic Experts Group),JPEG文件的扩展名为.jpg或.jpeg,它用有损压缩方式去除冗余的图像和彩色数据,在得到极高的压缩率的同时能展示十分丰富生动的图像,便可以用较少的磁盘空间获得较好的图片质量。对象
如今有一个512×512灰度图像,图像的某一列像素多是这样的数值:blog
能够用Pillow查看图像的某一列:
1 from PIL import Image 2 3 img = Image.open('cat.jpg') 4 width, height = img.width, img.height 5 px = img.load() 6 for i in range(height): 7 print(px[0, i]) 8 9 img_gray = img.convert('L') # 灰度图像转换 10 px = img_gray.load() 11 for i in range(height): 12 print(px[0, i]) 13 img_gray.show()
换成彩色图像也同样,只不过向量的每一个元素都变成了一个三元组,这里咱们仍是以简单的灰度图像为例。假设咱们用一个向量存储这个灰度图像。在图像压缩前,采用的是向量的标准基,图像是这这些标准基的线性组合:
对于一个图像来讲,相邻像素常常表明同一块区域,好比猫咪的身体,所以灰度值是很是接近的甚至彻底相同的。在一个极端状况下,好比图像展现了一块干净的黑板,此时图像的全部像素都相同,若是仍然使用标准基,则彻底忽略了图像的这一特性,此时一个更好的基是元素全为1的向量,仅经过这一个基向量就能完整地给出全部像素一致的图像的信息。虽然在大多数实际状况下图像的像素不是一致的,但这种处理思路仍然给了咱们压缩的可能。实际上咱们常常用全1向量做为图像的一个基向量,问题是,应该选择哪些向量与它配合?
下面是几个经常使用的基向量:
±1交叉出现,能够处理黑白交叉的图像,好比一个国际象棋的棋盘:
一半是1,另外一半是-1,能够处理一半明一半暗的图像,好比日出和日落:
这些基向量应该怎样选择呢?不一样行业的人员有不一样的选择,好比电视行业的人员基于信号扫描的方式选择基,电影行业的人员喜欢另外一种,而对于JPEG来讲,使用的是傅立叶基。
傅立叶基包括全1向量,电气工程师称之为DC向量。JPEG将一个图像分解成多个8×8的块,每一个块中的64个像素又被拆分红8个8×1的小块,对每个小块进行基变换处理。
实际上这组傅里叶基就是傅立叶矩阵的列向量:
这里咱们不过多地介绍傅立叶向量,只介绍JPEG压缩图像的原理。每个8×8的块有64个像素,这些像素能够存储在一个64维向量中,这个向量有64个基向量,所以每个块均可以看做64个基向量的系数。
JPEG的压缩是在64维空间中利用傅立叶向量作基变换。对于每一个8×8的块来讲,须要进行64次基变换,获得64个新系数。
首先输入信号p(8×8的像素块,实际上被拆分红8个8×1的列向量),而后从标准基进行基变换,变成傅立叶基,从而获得新的系数c,这一步是无损的过程。接下来将进行压缩,在压缩过程当中将丢失一些信息,是有损过程。经过设置阈值进行压缩,超过阈值的认为是肉眼看不出区别的,即便丢掉也没有太大关系。经过这种方法丢掉一部分基向量,获得一套新的系数 ,用新的系数乘以相应的傅立叶基并求和获得新的向量。
最终用于求和的向量已经不是64个,而是去掉了丢掉的部分,可能只剩下两三个,这就是压缩。若是向量个数从64个减到了3个,压缩比率是21:1。
视频文件能够看做一幅幅静态图像,压缩每一幅,而后播放,但这不是一个好方法,由于没有利用好视频的性质。视频是一系列连续的、高度相关的图像,一幅图像和下一幅很是接近。在时间和空间上,事物不会瞬间改变,一般是平滑地改变,能够根据前一个值预测出下一个值。咱们能够存储一幅基础图像,随后只存储下一幅图像的修正部分。
仍然以8×8的块为例,它的小波基是8个由1,0,-1构成的正交向量:
这是8维空间的8个向量,叫作小波。这组基有不少从1到-1的跳跃,实际上这只是小波的一个简单选择,还有不少更精细的选择。这里要作的是基变换,就是将标准基下的向量p表示为小波基的线性组合,并求出线性组合的参数c:
这是一个线性变换,W就是描述这个变换的矩阵,它以小波向量为列向量,称为小波矩阵。
咱们的目的是求出小波变换后的输出向量的坐标,即c = W-1P,一组性质很好的基可以快速求得c的值,性质很好又是几个意思?一是要可以快速求逆,例如快速傅里叶变换,这里也存在小波变换,小波矩阵中的向量都是正交的,所以它的逆等于它的转置,W-1 = WT;二是要有良好的压缩率,只要少许基向量就能接近信号量,好比在扔掉w5的坐标后,只损失了少许的数值。
A矩阵的列向量是一组新的基向量,x是旧基上的向量,x和新基向量坐标的关系是x = Ac。
已知一个线性变换T:R8→R8,当输入空间使用的一组基是v1,v2,…,v8时,线性变换对应的矩阵是A;对于输出空间的另外一组基u1,u2,…,u8来讲,线性变换对应的矩阵是B。A和B之间有怎样的联系呢?首先要明确T是一个什么样的变换,是一个旋转仍是一个投影,或者其它被指明的变换。A和B描述的是同一个线性变换,只不过使用了不一样的基,这两个矩阵是类似矩阵,B = M-1AM,M是基变换矩阵。
关于如何使用傅立叶向量进行图像压缩,能够参考冈萨雷斯的《数字图像处理》,写的很是详细。
出处:微信公众号 "我是8位的"
本文以学习、研究和分享为主,如需转载,请联系本人,标明做者和出处,非商业用途!
扫描二维码关注做者公众号“我是8位的”