我有兩個3D圖像,我需要使用「lsqcurvefit」註冊這兩個圖像。我知道我可以使用「imregister」,但是我想在Matlab中使用我自己的註冊,使用「lsqcurvefit」。我的圖像是高斯分佈。我沒有很好的記錄,我應該如何提供它,任何人都可以幫助我詳細?我如何使用lsqcurvefit進行圖像註冊?
圖像配準是使用仿射將源圖像映射到目標圖像的重複過程。我想使用強度基礎註冊,並使用我的圖像的所有體素。因此,我需要儘可能適合這兩張圖片。
感謝
我有兩個3D圖像,我需要使用「lsqcurvefit」註冊這兩個圖像。我知道我可以使用「imregister」,但是我想在Matlab中使用我自己的註冊,使用「lsqcurvefit」。我的圖像是高斯分佈。我沒有很好的記錄,我應該如何提供它,任何人都可以幫助我詳細?我如何使用lsqcurvefit進行圖像註冊?
圖像配準是使用仿射將源圖像映射到目標圖像的重複過程。我想使用強度基礎註冊,並使用我的圖像的所有體素。因此,我需要儘可能適合這兩張圖片。
感謝
這裏有一個如何使用lsqcurvefit
做到逐點圖像配準的例子。基本上你做了一個函數,它需要一組點和一個仿射矩陣(我們只是使用平移和旋轉部分,但如果需要,你可以使用歪斜和放大)並返回一組新的點。這可能有一個內置函數,但它只有兩行,所以很容易編寫。該函數是:
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)
由於在你的圖像是一個單一的高斯峯?還是多個高斯峯? – Staus 2015-02-24 05:08:25
@Staus多個峯值 – Ehsan 2015-02-24 05:11:19
快速版本 - 使用類似'imregionalmax'的方法找到局部最大值,在每個定義的大小(如預期的sigma * 3左右)周圍取一個子圖像,然後使用lsqcurvefit分別擬合一個2d高斯。給定每幅圖像中得到的本地化列表,然後可以使用lsqcurvefit來擬合方程中的變換矩陣([cos theta,-sin theta,translate x; sin theta,cos theta,translate y; 0 0 1])LocalizationsB = TransformMatrix *本地化A. – Staus 2015-02-24 05:32:52