ICCP演算法 剛性變換2

2022-08-09 08:48:09 字數 3322 閱讀 5422

在之前寫的iccp演算法隨筆中,使用了線段組匹配的方法。討論過程中發現這個方法相比於點集匹配複雜並且難理解多了,因此想按照原**的想法,把點集匹配的方法也用matlab實現了一下。

重新寫**的過程中發現,s矩陣解算得到的最佳旋轉角度theta的正負會影響點集的旋轉方向,因此需要計算匹配點到等值線最近點yi的距離,選擇能夠使變換後的點集與等值線最近點集yi距離最小的旋轉角度。

%修改transformation中的線段組匹配法,改成點集匹配法

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;

變換後的結果如下圖所示,黑色為初始點集(ins軌跡)xi,藍色為等值線最近點集yi,綠色為匹配後的結果。

當我僅僅調換測試資料點集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...