Procrustes Analysis普氏分析法

选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集:

由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并不具有仿射不变性,需要对其进行归一化处理。这里采用Procrustes分析方法对样本集中的所有形状集合进行归一化。形状和位置的载体还是样本点的空间坐标。

     普氏分析法是一种用来分析形状分布的方法。数学上来讲,就是不断迭代,寻找标准形状(canonical shape),并利用最小二乘法寻找每个样本形状到这个标准形状的仿射变化方式。(可参照维基百科的GPA算法)

本书中,两个形状的归一化过程(一个形状为canonical shape,另一个为样本形状):

(1)    求每个样本点i(i=1,2..,n)在N幅图像中的均值

(2)    对所有形状的大小进行归一化,即将每个样本点减去其对应均值

(3)    根据去中心化数据,计算每幅图像中形状的重心,对于第i幅图像,其重心为:

(4)    根据重心和角度,将标准和样本形状对齐在一起,使得两个形状的普氏距离最小,下式为普氏距离定义:

这个第(4)步的具体做法,不断迭代以下过程:

(a)通过计算每幅图像中所有归一化样本点的平均值得到每个图像的标准形状canonical shape。

(b)利用最小二乘法求每个图像中样本形状到标准形状的旋转角度。根据普氏距离的定义,也就是求:

其中的a和b表示仿射变换里旋转变化的参数:

对上式求偏导数,可以得到所求的a和b:

(c)根据旋转参数,对样本形状做旋转变化,得到和标准形状对齐的新的形状

(d)重复以上步骤,直到达到指定循环次数或者前后两次迭代之间canonical shape的绝对范数满足一定阈值

Procrustesanalysis的作用可以看作是一种对原始数据的预处理,目的是为了获取更好的局部变化模型作为后续模型学习的基础。如下图所示,每一个人脸特征点可以用一种单独的颜色表示;经过归一化变化,人脸的结构越来越明显,即脸部特征簇的位置越来越接近他们的平均位置;经过一系列迭代,尺度和旋转的归一化操作,这些特征簇变得更加紧凑,它们的分布越来越能表达人脸表情的变化。【剔除刚性部分、保留柔性部分】

上图为不同大小、不同长宽比的矩形,经过归一化过程后,各个样本点分布服从一定概率分布趋势。

具体代码实现:

函数:Mat shape_model::procrustes(const Mat &X,const int itol,constfloat ftol)

矩阵X:2n*N维矩阵,即有N副图像,每幅图像有n个特征点(2n是因为x和y坐标)

Itol:迭代次数

Ftol:求绝对范数的阈值

返回值:矩阵P,存放对齐后的形状坐标

 1 Mat shape_model::procrustes(const Mat &X,const int itol,const float ftol)2 {3   /* X.cols:特征点个数,X.rows: 图像数量*2 */4   int N = X.cols,n = X.rows/2; 5 6   //remove centre of mass7   Mat P = X.clone();8   for(int i = 0; i < N; i++)9   {
10     /*取X第i个列向量*/
11     Mat p = P.col(i);
12     float mx = 0,my = 0;
13     for(int j = 0; j < n; j++)
14     {
15         mx += p.fl(2*j);
16         my += p.fl(2*j+1);
17     }
18     /*分别求图像集,2维空间坐标x和y的平均值*/
19     mx /= n;
20     my /= n;
21     /*对x,y坐标去中心化*/
22     for(int j = 0; j < n; j++)
23     {
24         p.fl(2*j) -= mx;
25         p.fl(2*j+1) -= my;
26     }
27   }
28   //optimise scale and rotation
29   Mat C_old;
30   for(int iter = 0; iter < itol; iter++)
31   {
32     /*计算(含n个形状)的重心*/
33     Mat C = P*Mat::ones(N,1,CV_32F)/N;
34     /*C为2n*1维矩阵,含n个重心,对n个重心归一化处理*/
35     normalize(C,C);
36     if(iter > 0)
37     {
38       if(norm(C,C_old) < ftol)//norm:求绝对范数,小于阈值,则退出循环
39         break;
40     }
41     C_old = C.clone();
42     for(int i = 0; i < N; i++)
43     {
44       //求当前形状与归一化重心之间的旋转角度,即上式a和b
45       Mat R = this->rot_scale_align(P.col(i),C);
46       for(int j = 0; j < n; j++)
47       {
48         float x = P.fl(2*j,i),y = P.fl(2*j+1,i);
49         /*仿射变化*/
50         P.fl(2*j  ,i) = R.fl(0,0)*x + R.fl(0,1)*y;
51         P.fl(2*j+1,i) = R.fl(1,0)*x + R.fl(1,1)*y;
52       }
53     }
54   }
55 return P;
56 }

http://blog.csdn.net/jinshengtao/article/details/43376049

转载自:http://www.cnblogs.com/nsnow/p/4745730.html

Procrustes Analysis(普氏分析)相关推荐

  1. java常规普氏分析法_人脸对齐:Procrustes analysis 普氏分析

    概述 在人脸相关应用中,获得的人脸图像常常形状各异,这时就需要对人脸形状进行归一化处理.人脸对齐就是将两个不同的形状进行归一化的过程,将一个形状尽可能地贴近另一个形状. 值得注意的是,在英语文献中,F ...

  2. Procrustes Analysis普氏分析法

    选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集: 由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并不具有仿射不变性,需要对其进行归一化处理.这里采用 ...

  3. 普氏分析法-MATLAB工具箱函数

    Hello,everyone! 我是鲁班·,一个热衷于科研和软开的胖子! 1 理论 Procrustes Analysis普氏分析法,此博客对普氏分析法理论介绍的还不错,有兴趣的同学可以读一读. 2 ...

  4. 多维标度法(MDS,Multidimensional Scaling)及普氏分析(Procrustes Analysis)在人体姿态关节点上的简单示例(python)

    多维标度法(MDS,Multidimensional Scaling) 多维标度法一个简单的应用示例就是,已知一组城市之间的相对距离关系(相似矩阵),如何求解出各个城市在地图上的位置,使其尽可能满足前 ...

  5. opencv+face_recognition+python实现换脸(face swap)操作(3)——基于普氏分析法(Procrustes Analysis)的代码实现

    #获得特征点 def ladmask(img):faces_loaction=face_recognition.face_locations(img,number_of_times_to_upsamp ...

  6. 普氏分析在生信中的应用

    普氏分析(Procrustes Analysis) 在微生物群落研究的过程中,我们经常需要评估微生物群落结构与环境因子整体之间是否具有显著的相关性,此时,通常使用的方式是Mantel test和普氏分 ...

  7. 普氏分析 matlab,一种考虑土拱效应的砂土地层深埋盾构隧道开挖面极限支护力计算方法与流程...

    本发明涉及一种分析深埋砂土地层中盾构隧道开挖面稳定性的方法,尤其 涉及一种考虑深埋砂土地层中的盾构隧道的开挖面极限支护力计算方法,属于 盾构施工技术领域. 背景技术: 盾构施工技术因其机械化程度高.安 ...

  8. java常规普氏分析法,python AI换脸 用普氏分析法(Procrustes Analysis)实现人脸对齐...

    1.图片效果 2.原代码 # !/usr/bin/python # -*- coding: utf-8 -*- # Copyright (c) 2015 Matthew Earl # # Permis ...

  9. 普氏分析法的输入和输出实例,matlab图像处理

    X=[1,2;3,3] Y=[1,2;3,4] [a,b,c]=procrustes(X,Y) Z = c.b * Y * c.T + c.c a = -4.4409e-16 b = 1 23 3 c ...

最新文章

  1. 社区电商才是未来,新科技才是社区电商的核心,社区电商如何实现核心竞争力呢?
  2. java6 disable ssl2.0_SpringBoot2.0如何启用https协议
  3. PHP中 base64_decode与base64_encode加密解密函数
  4. EOJ_1018_玩具谜题
  5. 什么是高清DVI光端机?dvi光端机的技术参数及应用有哪些?
  6. 数据结构探险——线性表篇
  7. “有人拿十几万很开心地走了” 滴滴裁员名额员工竟然抢破头 官方回应...
  8. 使用自动补全功能- MATLAB
  9. 区块链只能算半个“信任机器”,隐私计算才是真正的信任机器?
  10. php 删除最后一个空数组,php删除空数组
  11. java打印出日历_java控制台打印本月的日历
  12. SPR传感原理(附Matlab源码)
  13. linux安装protoc
  14. 能自动生成标注的APP,尝试一下吧
  15. 物联网智能家居ppt
  16. Java集成云打印机(芯烨云)——文档篇
  17. win10便签如何卸载?win10便签卸载和安装方法
  18. python幂次_python n次幂
  19. sql查询当天交易总额最大的用户信息_如何分析交易记录? 因为后面要分析“每种类型用户的总交易金额”,所以保留左表(用户交易记录表)中的全部用户数据。 【题目】 某商场为了分析用... - 雪球...
  20. 最适合新手小白的TikTok干货运营手册

热门文章

  1. 人工智能 - paddlepaddle飞桨 - 入门之安装教程
  2. Linux下记住Gitee账户密码
  3. 容器编排技术 -- 基于Docker本地运行Kubernetes
  4. ORA-39171: 作业出现可恢复的等待
  5. 使用Docker安装的Tuleap-aio.查看admin默认密码
  6. Mysql搭建PXC集群 - Percona XtraDB Cluster
  7. json转python_将“true”(JSON)转换为Python等效的“True”
  8. crontab -e 报错(E518: Unknown option: foldenable)
  9. java中修饰符的说明
  10. 构建python应用_构建天气应用