2012-01-22 7 views
2

私は、翻訳と回転によって1つのイメージを他のイメージに変換することによって一致させる必要のある2つのイメージを持っています。これのために、私はこのような関数を持っています:fminuncの初期ステップを調整する方法は?

function [differences] = cost_function(transformation) 

disp(transformation); 

offset_x = transformation(1); % one of the images will be shifted by these many 
offset_y = transformation(2); % pixels in either direction 
angle = transformation(3); % and rotated by this much 

% snip: 
% * transform the second image 
% * otsu treshold both 
% * xor the results 
% * count pixels that xored 

次に私はその最小値を見つけようとします!

1.0e-007 * 
    0.1490   0   0 
    1.0e-007 * 
     0 0.1490   0 
    1.0e-007 * 
     0   0 0.1490 
     0   0   1 
    0.0000   0 1.0000 
     0 0.0000 1.0000 
     0   0 1.0000 
     0   0 0.3333 
    0.0000   0 0.3333 

ソルバがで続行するのが最善の行を見つけるために、各次元でほんの少し微調整しようとしますが、明らかに画像をシフト:

best_transform = fminunc(@cost_function, [0 0 0]); 

しかし、ソルバーログは非常に大きな問題を示しています0.1490ピクセルで実際にはあまり効果がありませんが、0.1490ラジアンでそれをシフトするのは当然です。しかし、実際には0.1490がどこから来たのか分かりません。

The documentationここではアドバイスをしていないようです。ソルバーの初期ステップをどのように増やすことができますか?

答えて

0

私は現在、この場しのぎを持っている:

best_score_so_far = 9999999999; 
best_so_far = [0 0 0]; 
optimset('display', 'off', 'MaxIter', 100); 
for dist = 1:1:10 
    for angle = 0:2*pi/4/dist:2*pi 
     x = cos(angle)*dist; 
     y = sin(angle)*dist; 
     disp([dist angle x y]); %heh 
     [best, cost] = fminunc(@(angle)cost_function([x,y,angle]), 0); 
     if(cost < best_score_so_far) 
      best_score_so_far = cost; 
      best_so_far = best; 
     end 
    end 
end 

...しかし、それは、醜いスーパースロー、と、まあ、その場しのぎです。

2

fminuncは、最小限の連続関数を見つけるように設計されていますが、あなたが指摘したように、画像を微小量ずらすピクセル数を変更すると、結果は得られません。

foolfminuncあなたの関数が実際に継続していると信じるように目的関数を適切にスケーリングすることで、この問題を解決できます。それを達成するために、単にような適度に大きなスカラーしてオフセットパラメータを乗算:

offset_x = transformation(1)*1000; 
offset_y = transformation(2)*1000; 
angle = transformation(3); 

画素の数がシフト取得するスカラーの同一のセットによって最終的な溶液を分割します。

一般に、問題が不連続性の問題を抱えていない場合でも、非線形最適化問題における変数の適切なスケーリングは重要です。

関連する問題