私は 3D ボリュームと 2D 画像、および 2 つの間の近似マッピング (ねじれのないアフィン変換、既知のスケーリング、回転と平行移動はほぼ既知であり、フィッティングが必要です) を持っています。このマッピングにエラーがあり、さらに 2D 画像を 3D ボリュームに登録したいためです。以前に登録用のコードを書いたことはありませんが、これを解決するプログラムやコードが見つからないため、試してみたいと思います。お互いの情報を最適化するのが登録の基準だと思います。2 つの画像の強度が等しくないため、これも適していると思います。そこで、変換用の関数、相互情報量用の関数、最適化用の関数を作成する必要があると思います。
記事に基づいて、2 年前の mathworksスレッドでいくつかの Matlab コードを見つけました。OPは、彼女がコードを機能させることができたと報告していますが、彼女がそれをどのように行ったかは正確にはわかりません。また、matlab の IP パッケージには実装がありますが、私はそのパッケージを持っておらず、オクターブに相当するものはないようです。SPMは matlab を使用し、登録を実装したプログラムですが、2d to 3d の登録には対応していません。ファイル交換には、相互情報を使用して 2 つの 2D 画像を登録する力ずくの方法があります。
彼女がしているのは、多平面再構成関数と類似度/エラー関数を最小化アルゴリズムに渡すことです。しかし、詳細はよくわかりません。たぶん、最初からやり直す方が良いでしょう:
load mri; volume = squeeze(D);
phi = 3; theta = 2; psi = 5; %some small angles
tx = 1; ty = 1; tz = 1; % some small translation
dx = 0.25, dy = 0.25, dz = 2; %different scales
t = [tx; ty; tz];
r = [phi, theta, psi]; r = r*(pi/180);
dims = size(volume);
p0 = [round(dims(1)/2);round(dims(2)/2);round(dims(3)/2)]; %image center
S = eye(4); S(1,1) = dx; S(2,2) = dy; S(3,3) = dz;
Rx=[1 0 0 0;
0 cos(r(1)) sin(r(1)) 0;
0 -sin(r(1)) cos(r(1)) 0;
0 0 0 1];
Ry=[cos(r(2)) 0 -sin(r(2)) 0;
0 1 0 0;
sin(r(2)) 0 cos(r(2)) 0;
0 0 0 1];
Rz=[cos(r(3)) sin(r(3)) 0 0;
-sin(r(3)) cos(r(3)) 0 0;
0 0 1 0;
0 0 0 1];
R = S*Rz*Ry*Rx;
%make affine matrix to rotate about center of image
T1 = ( eye(3)-R(1:3,1:3) ) * p0(1:3);
T = T1 + t; %add translation
A = R;
A(1:3,4) = T;
Rold2new = A;
Rnew2old = inv(Rold2new);
%the transformation
[xx yy zz] = meshgrid(1:dims(1),1:dims(2),1:1);
coordinates_axes_new = [xx(:)';yy(:)';zz(:)'; ones(size(zz(:)))'];
coordinates_axes_old = Rnew2old*coordinates_axes_new;
Xcoordinates = reshape(coordinates_axes_old(1,:), dims(1), dims(2), dims(3));
Ycoordinates = reshape(coordinates_axes_old(2,:), dims(1), dims(2), dims(3));
Zcoordinates = reshape(coordinates_axes_old(3,:), dims(1), dims(2), dims(3));
%interpolation/reslicing
method = 'cubic';
slice= interp3(volume, Xcoordinates, Ycoordinates, Zcoordinates, method);
%so now I have my slice for which I would like to find the correct position
% first guess for A
A0 = eye(4); A0(1:3,4) = T1; A0(1,1) = dx; A0(2,2) = dy; A0(3,3) = dz;
% this is pretty close to A
% now how would I fit the slice to the volume by changing A0 and examining some similarity measure?
% probably maximize mutual information?
% http://www.mathworks.com/matlabcentral/fileexchange/14888-mutual-information-computation/content//mi/mutualinfo.m