Hotelling transform,霍特林变换

转自:https://blog.csdn.net/smartempire/article/details/30097833

最近在细看一篇论文并且实现里面的方法,有一节是依靠hotelling变换实现人脸矫正,方法比较简单,不幸的是里面的公式是错的,所以在这里写一下原理顺带附上MATLAB实现。

假设有一组人脸数据P,P是3xN维的矩阵,每一列代表三维空间中的一个点,N列代表N个点,如下:

Hotelling transform,霍特林变换_第1张图片

Hotelling transform,霍特林变换_第2张图片

数据的均值表示为m,相当于数据的重心:

 

P的协方差C可以表示为下式,注意C是3x3的矩阵:

协方差C的特征向量可以通过如下求解:

其中V是特征向量v1,v2,v3(因为C是3x3的矩阵,所以特征向量只可能有三个)构成的矩阵,D是特征值d1,d2,d3构成的对角矩阵,特征向量和特征值一一对应,求解的MATLAB在下面,要说明的是MATLAB里的eig函数得出的V是按照D升序排列的,就是d1

下面是hotelling变换的关键一步:

其中U是这样定义的,V=[v1;v2;v3],那么U=[v3;v2;v1]^T,就是说要按照D降序排列然后还要转置一下。

MATLAB实现如下:

Hotelling transform,霍特林变换_第3张图片Hotelling transform,霍特林变换_第4张图片

感觉这个hotelling和PCA有些像,hotelling找到数据分布最大的三个方向,然后将数据整体旋转到这三个方向上来,以后有时间再补充详细原理。最终得到的旋转人脸如下,因为最初的人脸没什么旋转,所以得到的结果效果也不明显,而且处理过程要多次迭代到V不再变化才能矫正姿态,我这里只做了一次变换。
Hotelling transform,霍特林变换_第5张图片

你可能感兴趣的:(图像基础)