在之前寫的iccp演算法隨筆中,使用了線段組匹配的方法。討論過程中發現這個方法相比於點集匹配複雜並且難理解多了,因此想按照原**的想法,把點集匹配的方法也用matlab實現了一下。
重新寫**的過程中發現,s矩陣解算得到的最佳旋轉角度theta的正負會影響點集的旋轉方向,因此需要計算匹配點到等值線最近點yi的距離,選擇能夠使變換後的點集與等值線最近點集yi距離最小的旋轉角度。
%修改transformation中的線段組匹配法,改成點集匹配法變換後的結果如下圖所示,黑色為初始點集(ins軌跡)xi,藍色為等值線最近點集yi,綠色為匹配後的結果。clc;
clear all;
%測試資料
% xi=[0,-2.5; 2,-1.5; 4.5, 0]; %ins軌跡
% yi=[1,-0.5; 3,-1; 5,0]; %等值線最近點
xi=[4.5, 0; 2,-1.5; 0,-2.5]; %ins軌跡
yi=[5,0; 3,-1; 1,-0.5]; %等值線最近點
xi = xi'
; % 注意格式為列:橫座標,縱座標;行:不同的點座標
yi = yi'
;%尋找使目標函式最小的變換方式(有權重)
%權重:全部為1,所有點視為同等重要
w=0; %權重
w_sum=0; %總權重
n=3;
for i=1:n %分配各點權重
w(i) = 1; %假設權重為1
% w(i) = n + 1 - i; %假設按時間順序,排在前面的點更重要
w_sum = w_sum +w(i);
end%計算帶權重的質心
x_center=zeros(2,1
);y_center=zeros(2,1
);for k=1
:n x_center(
1) = x_center(1) + w(i) * xi(1
, k);
x_center(
2) = x_center(2) + w(i) * xi(2
, k);
y_center(
1) = y_center(1) + w(i) * yi(1, k); %真實軌跡
y_center(
2) = y_center(2) + w(i) * yi(2
, k);
endx_center=x_center/w_sum; %權重由標號定義
y_center=y_center/w_sum;
%交叉協方差矩陣
s = 0
;for i = 1
: n s = s + w(i) * (yi(:, k) - y_center(:)) * ((xi(:, k) - x_center(:))'
);end
%求解旋轉矩陣
%最大特徵值
lamda(
1)=((s(1,1)+s(2,2))^2+(s(1,2)-s(2,1))^2)^(1/2
);lamda(
2)=-lamda(1
);lamda(
3)=((s(1,1)-s(2,2))^2+(s(1,2)+s(2,1))^2)^(1/2
);lamda(
4)=-lamda(3
);lamda_max=max(lamda);
%判斷旋轉方向
theta(
1) = 2 * atan(-(s(1,1)+s(2,2)-lamda_max)/(s(1,2)-s(2,1
)));
%旋轉矩陣r和平移向量t
r=[cos(theta(1)), -sin(theta(1
)); sin(theta(
1)), cos(theta(1))]; %關於座標系原點旋轉
t=y_center-r*x_center;
%變換結果
for i=1
:n xis_1(:,i) = t + r*xi(:,i);
end%計算點之間的距離
sum_norm_1 = 0
;for i = 1
: n sum_norm_1 = w(i) * norm(yi(:,i)-xis_1(:,i),2
);end
theta(
2) = -2 * atan(-(s(1,1)+s(2,2)-lamda_max)/(s(1,2)-s(2,1))); %旋轉方向如何確定
%旋轉矩陣r和平移向量t
r=[cos(theta(2)), -sin(theta(2
)); sin(theta(
2)), cos(theta(2))]; %關於座標系原點旋轉
t=y_center-r*x_center;
%變換結果
for i=1
:n xis_2(:,i) = t + r*xi(:,i);
end%計算點之間的距離
sum_norm_2 = 0
;for i = 1
: n sum_norm_2 = w(i) * norm(yi(:,i)-xis_2(:,i),2
);end
if sum_norm_1 >sum_norm_2
xis =xis_2;
else
xis =xis_1;
endplot(xi(
1,:),xi(2,:),'
o-k'
);hold on;
plot(yi(
1,:),yi(2,:),'
*-b'
);hold on;
plot(xis(
1,:),xis(2,:),'
*-g'
);hold on;
當我僅僅調換測試資料點集xi和yi中的點排列順序,發現會得到另乙個看起來對稱的匹配結果,如下圖兩條綠色曲線所示:
為什麼輸入點的順序不同,得到的最佳匹配結果也不同,產生兩個看似對稱的結果?這可能是因為s矩陣的計算會受到點排序影響。具體如何出現這種結果,我還沒有想明白,希望大家能夠和我一起討論!
謝謝大家啦!
剛性仿射變換演算法 仿射變換
哎慢慢來吧,感覺一大堆東西看不懂.仿射變換就是affine transformation 這是乙個跟影象相關的變換,影象變換是通過矩陣變換來實現的。影象的幾個基本變換有平移 縮放 旋轉 仿射 透視。剛性變換 就像這個題目這樣顯示的,就是非常強硬的變換,在這個二維平面上開始是怎麼樣,後來就是怎麼樣 仿...
2 傅利葉變換
傅利葉 任何週期函式,都可以看作是不同振幅,不同相位正弦波的疊加。好比利用對不同琴鍵不同力度,不同時間點的敲擊,可以組合出任何一首樂曲。傅利葉變換 則是將乙個時域非週期的連續訊號,轉換為乙個在頻域非週期的連續訊號。先在紙上畫乙個sin x 不一定標準,意思差不多就行。不是很難吧。好,接下去畫乙個si...
演算法 z字型變換
題目 將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r 之後從左往右,逐行讀取字元 pahnaplsiigyir 實現乙個將字串進行指定行數變換的函式 ensp string convert string s,int numrow...