基于SVD的图像压缩实践
在之前的介绍里,我们讲过了SVD分解的基本原理。一个mxn的矩阵A可以分解为三个矩阵相乘:
A可以被U和V表示,而其中的奇异值分别为U的列向量和V的行向量的权重:
通常,前k大的奇异值就足以占了所以奇异值90%的比重,这种情况下,我们只需要选择前k个奇异值,对应地选择U的前k个列向量,还有V的前k个行向量,就可以近似表示出矩阵A:
在图像处理中,我们把一张图片的每个像素点作为矩阵中的元素,则我们得到一个mxn的矩阵,利用SVD分解,取前k个奇异值,就能实现图像的压缩:
同时我也可以称作其为图像降噪,因为可以认为奇异值非常小的那些项是噪声。
Anyway, 直接上代码
完整代码
1 | import matplotlib.pyplot as plt |
运行结果
1 | $ python imageCompress.py -p pic_1.png -c 1000 |
当K=10,即选取10个奇异值进行压缩:
当K=30
当K=50
当K=100
当K=500
可见,当使用前100个奇异值(约占全部奇异值数量的10%),就可以比较好地表示原图像了