变脸--奇异值分解SVD在图像处理的应用

前言

矩阵变化中有非常重要的变换为奇异值分解SVD。形式很简单,但是在具体处理中却具有非常重要的物理意义。

SVD分解

SVD分解在图像处理中,也可理解为二维数据处理中具有非常重要的意义。如下: A = U D V T A=UDV^T A=UDVT
变脸--奇异值分解SVD在图像处理的应用_第1张图片

这里U和V均满足 U U T = I UU^T=I UUT=I, V V T = I VV^T=I VVT=I
变脸--奇异值分解SVD在图像处理的应用_第2张图片

其中D如下:
变脸--奇异值分解SVD在图像处理的应用_第3张图片
现在:假如A代表一条曲线,如左边,U的每个列向量代表直线,向下的曲线和转折的曲线等等,而 β 1 , 2 , 3 \beta_{1,2,3} β1,2,3代表的是有D和 V T V^T VT决定,我们可以认为U是基向量输入,D是增益系数,V是输出控制矩阵(按照控制理论理解)
变脸--奇异值分解SVD在图像处理的应用_第4张图片那么在图像领域应该如何理解尼?这里有一张像素非常大的图片(2000,1000(大致的值))
变脸--奇异值分解SVD在图像处理的应用_第5张图片
我们对它做svd分解正常应该分解出一个2000,2000的基向量矩阵,但我们只取其前4列的基向量:
变脸--奇异值分解SVD在图像处理的应用_第6张图片
我们可以看见前四行的重构基本还原了大体结构,接下来我们来看D矩阵中对角线上数值的变化:

变脸--奇异值分解SVD在图像处理的应用_第7张图片可以看到,这个值下降得非常快,前文我们说过,中间矩阵D相当于增益矩阵,说明图像大部分有较大的增益控制,所以我们只需要采用增益值大的所对应的基向量就基本可以表示这张图形。例子如下:

左图是原图,右两图都是舍弃掉了D矩阵中较小的值所对应的列向量所构成。
也就是说我们在进行某些识别工作时,可以用较少的数据空间代表原来数据的绝大部分特征,而通常这样的特征也基本够做分类与判别。
更有趣的是,当我们获得一张图像的基向量矩阵U时如下图·:
变脸--奇异值分解SVD在图像处理的应用_第8张图片
我们改变其D和V矩阵(改变输出)就可以刻画比如年龄的变化:

变脸--奇异值分解SVD在图像处理的应用_第9张图片
这是不是就和美图秀秀里的样貌变化功能有异曲同工之妙尼。下面附上简单的svd重构代码:

clear,clc;
close all;
img=double(imread('filepath'))
figure(1);
subplot(211);
imshow(img,[]);title('original');
[m,n] = size(img);
[U,S,V] = svd(img);%SVD分解
decomp = U(:,:)*S(:,1:n)*V(:,1:n)';%n值根据情况取得,这里基向量矩阵仍然可以保持完整,也可以取前n列,感兴趣的朋友可以去试一下两者间的不同
subplot(212);imshow(decomp,[]);title('svd-前n个特征重构');


你可能感兴趣的:(图像处理)