图片压缩
这篇博客奇异值的物理意义是什么有例子分析使用奇异值分解
来进行图像压缩
与图像去噪
,并且对于不是方阵的矩阵也可以分解。
下面这个图像压缩例子是以方阵
图像为例,使用暴力分解
得到特征值和特征向量。但是一般情况下,图像不是方阵,所以没有特征值,就需要用到SVD奇异值分解
来进行压缩。方法点击这里。
千万别把本文图像压缩
和PCA降维
当成一回事:
- 因为PCA降维是降低特征的维度,而本文图像压缩并没有降低特征的维度,也没有求平均值、求协方差、求协方差的特征值和特征向量等操作;
- 只不过,某些地方和PCA有点像,都是取前
k
个主要特征; - 一个是直接求图像像素的
原始矩阵
的特征向量,另一个是求原始矩阵的协方差矩阵
的特征向量。
这里附上PCA
的相关博客:【机器学习】降维——PCA(非常详细)。
PCA降维
中可能会用到奇异值分解
,【数学和算法】SVD奇异值分解原理、以及在PCA中的运用。
比如说,有下面这么一副512x512的图片(方阵才有特征值,所以找了张正方形的图):
这个图片可以放到一个矩阵里面去,就是把每个像素的颜色值填入到一个512x512的A矩阵中。
其中,
Λ
\color{blue}\Lambda
Λ是对角阵,对角线上是从大到小
排列的特征值
。
现在,有了A的特征值,可以求得上面的对角阵
Λ
\color{blue}\Lambda
Λ,也可以求出特征值对应的特征向量,从而也就得到了P和P的逆,那么就可以反推出矩阵A。
我们在对角阵
Λ
\color{blue}\Lambda
Λ中只保留前面50个的特征值
(也就是最大的50个,其实也只占了所有特征值的百分之十),其它的都填0,P也只保留前50个特征向量,其他特征向量值全部赋值为0,并不是去掉那些向量,重新计算矩阵后,恢复为下面这样的图像:
效果还可以,其实一两百个特征值之和可能就占了所有特征值和的百分之九十了,其他的特征值都可以丢弃了。
该方法就是使用暴力特征分解
,运算时很耗时,我自己测试时,跑程序有明显的卡顿,效率很低,还会求出复数解,不推荐。
上面的图像压缩
A
m
∗
m
A_{m*m}
Am∗m,把对角阵
Λ
\color{blue}\Lambda
Λ中的第k
个后面的对角元素全置零,那么对应的矩阵
P
P
P就可以把第k
个后面向量也全部置零,这样
P
P
P就只保存m*k
个数,
Λ
\color{blue}\Lambda
Λ只保存k
个数,总共保存m*k+k
,由于m>>k
,所以压缩后需要保存的数字个数肯定远小于保存原始像素矩阵有m*m
个值,即m*k+k <<m*m
。这样就达到了压缩的目的。需要恢复图像的时候,就可以直接使用这m*k+k
个数字即可。
例如,矩阵
A
A
A为512*512的图像,取矩阵
A
A
A的前50
个特征值,那么,需要保存的数字个数为:512*50+50=25650
,而不压缩的话需要存储原始矩阵512*512=262144
,一下子少了10倍。
本文的图片压缩
借鉴马同学博客 《如何理解矩阵特征值和特征向量?》中的例子,添加了我自己的一些理解和说明。