-1

「lsqcurvefit」を使用してこれらの 2 つの画像を登録する必要があります。「imregister」を使用できることはわかっていますが、Matlab で「lsqcurvefit」を使用して独自の登録を使用したいと考えています。私の画像はガウス分布に従っています。どのように提供すればよいかについては十分に文書化されていません。誰かが私を詳細に助けることができますか?

イメージ レジストレーションは、アフィンを使用してソース イメージをターゲット イメージにマッピングするプロセスの繰り返しです。強度ベース レジストレーションを使用したいのですが、画像のすべてのボクセルを使用します。したがって、これら2つの画像をできるだけ合わせる必要があります。

ありがとう

4

1 に答える 1

1

を使用して点ごとの画像レジストレーションを行う方法の例を次に示しますlsqcurvefit。基本的には、一連のポイントとアフィン行列を受け取り (移動部分と回転部分を使用するだけですが、必要に応じて傾斜と拡大を使用できます)、新しいポイント セットを返す関数を作成します。すでに組み込み関数があるのでしょうが、2行しかないので書きやすいです。その機能は次のとおりです。

function TformPts = TransformPoints(StartCoordinates, TransformMatrix)

TformPts = StartCoordinates*TransformMatrix;

これは、いくつかのポイントを生成し、それらをランダムな角度とベクトルで回転および変換し、そのTransformPoints関数を入力として使用しlsqcurvefitて、登録に必要な変換行列を適合させるスクリプトです。次に、登録されたポイントのセットを生成するのは単なる行列の乗算です。これを正しく行った場合、以下のコードを実行すると、赤い円 (元のデータ) が黒い星 (シフトされてから登録されたポイント) と非常によく一致します。

% 20 random points in x and y between 0 and 100
% row of ones pads out third dimension
pointsList = [100*rand(2, 20); ones(1, 20)];

rotateTheta = pi*rand(1); % add rotation, in radians
translateVector = 10*rand(1,2); % add translation, up to 10 units here

% 2D transformation matrix
% last row pads out third dimension
inputTransMatrix = [cos(rotateTheta), -sin(rotateTheta), translateVector(1);
                    sin(rotateTheta), cos(rotateTheta), translateVector(2);
                    0 0 1];


% Transform starting points by this matrix to make an array of shifted
% points.  
% For point-wise registration, pointsList represents points from one image,
% shiftedPoints points from the other image
shiftedPoints = inputTransMatrix*pointsList;
% Add some random noise
% Remove this line if you want the registration to be exact
shiftedPoints = shiftedPoints + rand(size(shiftedPoints, 1), size(shiftedPoints, 2));

% Plot starting sets of points
figure(1)
plot(pointsList(1,:), pointsList(2,:), 'ro');
hold on
plot(shiftedPoints(1,:), shiftedPoints(2,:), 'bx');
hold off

% Fitting routine
% Make some initial, random guesses
initialFitTheta = pi*rand(1);
initialFitTranslate = [2, 2];

guessTransMatrix = [cos(initialFitTheta), -sin(initialFitTheta), initialFitTranslate(1);
                    sin(initialFitTheta), cos(initialFitTheta), initialFitTranslate(2);
                    0 0 1];

% fit = lsqcurvefit(@fcn, initialGuess, shiftedPoints, referencePoints)             
fitTransMatrix = lsqcurvefit(@TransformPoints, guessTransMatrix, pointsList, shiftedPoints);

% Un-shift second set of points by fit values
fitShiftPoints = fitTransMatrix\shiftedPoints;

% Plot it up
figure(1)
hold on
plot(fitShiftPoints(1,:), fitShiftPoints(2,:), 'k*');
hold off

% Display start transformation and result fit
disp(inputTransMatrix)
disp(fitTransMatrix)
于 2015-02-25T05:05:50.423 に答える