对三维点集的归一化变换

来源:互联网 发布:网络教育平台有哪些 编辑:程序博客网 时间:2024/05/21 17:35

1. 前言

昨天处理实验室的数据,处理了整整一天, 都没有出来理想的结果, 后来调试发现, 出现了两个问题:
1. 非线性优化中传入的计算参数传错了。
2. 程序中使用各项同性的归一化方法出来的结果, 比非各项同性归一化出来的结果明显要好。

2. 归一化变换

在计算 2D 单应矩阵 H 的时候, 一定存在某些坐标系表示的方式明显优于其他坐标系, 对于3D 空间中的数据变化计算他们之间的 H=(R0TT1) 也有类似的特性, 我们下面按照2D 空间变化进行讨论。

2.1 各向同性缩放 2D

  1. 每幅图像中的坐标进行平移, 使得点集的形心移动至原点
  2. 对坐标系进行缩放, 使得点中 x=(x,y,w)T中的x, y, w 总体上有一样的平均值, 选用一个各向同性的缩放因子, 使得一个点的 坐标等量缩放, 我们令 平均点为 (1,1,1)T, 此时缩放因子使得x 到 原点距离为 2。 同理, 如果是3D 点, 平均点应该为 (1,1,1,1)T, 此时, x 到原点的距离应该为 (3)

2.2 归一化变换的意义

数据归一化, 可以提高结果的精度, 同时, 归一化算法对于任何尺度缩放和坐标原点的选择都是不变的。
我们可以这样去理解: 归一化为测量数据选择了有效的标准坐标系, 预先消除了坐标变换的影响。因此, 在做类似DLT 的相关运算的时候, 代数最小化的过程其实是在一个固定的标准坐标系下进行的, 从而, DLT 算法实际上关于相似变换是不变的。
数据归一化的过程在类似 DLT 的算法中的效果是实质性的, 不能不要视他为可有可无的。

2.3 非各向同性缩放

理论上, 我们也可以进行非各向同性的归一化方法, 效果是不会比各向同性的缩放有显著提高。可是,我们这里的效果不是提高了, 而是下降了, 鉴于这个结果, 我们还是最好就采用各项同性的归一化方法好了。

2.4 归一化变换code

%% 实验室师兄的版本function [T] = normalize(w)    % 变换目标:中心在原点且到原点的平均距离为sqrt(3)    if  size(w,1)<size(w,2)        w = w';    end    t = -mean(w(:,1:3),1);    w = w(:,1:3) + repmat(t,[size(w,1),1]);    dis = mean(sqrt(w(:,1).*w(:,1)+w(:,2).*w(:,2)+w(:,3).*w(:,3)));    v = sqrt(3)/dis;    t = t'*v;    T = [eye(3)*v,t];    T = [T;0,0,0,1];end
%% normalize A 我的版本function [T] = normalize(A)     assert(size(A, 1) == 4, 'A should be 4 x n')     mean_A = mean(A,2);     remain = A - repmat(mean_A, [1, size(A, 2)]);     remain_pt = remain(1:3, :);     dis = mean(sqrt(remain_pt(1, :).*remain_pt(1, :) + remain_pt(2, :).*remain_pt(2, :) + remain_pt(3, :).*remain_pt(3, :)));     diag_diag_T_A = repmat(sqrt(3)/dis, [3, 1]);     T_A = diag([diag_diag_T_A ;1])*...        [1 0 0 -mean_A(1)         0 1 0 -mean_A(2)         0 0 1 -mean_A(3)         0 0 0 1];end
0 0