Ich habe ein 3D-Volumen und ein 2D-Bild und eine ungefähre Zuordnung (affine Transformation ohne Skwewing, bekannte Skalierung, Rotation und Übersetzung etwa bekannt und muss passen) zwischen den beiden. Weil bei diesem Mapping ein Fehler aufgetreten ist und ich das 2D-Bild weiter auf das 3D-Volumen registrieren möchte. Ich habe noch keinen Code für Registrierungszwecke geschrieben, aber weil ich keine Programme oder Codes finden kann, um das zu lösen, möchte ich versuchen, dies zu tun. Ich glaube, der Standard für die Registrierung ist zu optimieren mutual information. Ich denke, das wäre auch hier passend, weil die Intensitäten der beiden Bilder nicht gleich sind. Also ich denke, ich sollte eine Funktion für die Transformation, eine Funktion für die gegenseitige Information und eine Funktion für die Optimierung machen.Rigid ein 2D-Bild zu einem 3D-Volumen mit guter Anfangsrate für affine Transformation
Ich habe Matlab-Code auf einem Mathworks thread vor zwei Jahren gefunden, basierend auf einem article. Die OP berichtet, dass sie es geschafft hat, dass der Code funktioniert, aber ich verstehe nicht, wie sie das genau gemacht hat. Auch im IP-Paket für Matlab gibt es eine implementation, aber ich habe dieses Paket nicht und es scheint kein Äquivalent für octave zu sein. SPM ist ein Programm, das Matlab verwendet und hat Registrierung implemented, aber nicht mit 2D-Registrierung zu bewältigen. Auf dem Dateiaustausch gibt es eine Brute-Force method, die zwei 2D-Bilder mit gegenseitigen Informationen registriert.
Was sie tut, besteht darin, eine multiplanare Rekonstruktionsfunktion und eine Ähnlichkeits-/Fehlerfunktion in einen Minimierungsalgorithmus zu überführen. Aber die Details verstehe ich nicht ganz. Vielleicht wäre es besser, neu zu beginnen:
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
Puh. Das hört sich nach einem schwierigen (aber interessanten) Problem an. Wir können keine Kontinuität in den Volumendaten annehmen, daher wird eine Newton-Iteration wahrscheinlich fehlschlagen. Man könnte nach Features in den 3D- und 2D-Daten ähnlich wie bei [SIFT] (http://en.wikipedia.org/wiki/Scale-invariant_feature_transform) suchen und dann einige [RANSAC] (http://de.wikipedia.org/wiki/RANSAC-Algorithmus). Wenn Ihre Schätzung gut genug ist, können Sie [ICP] (http://en.wikipedia.org/wiki/Iterative_closest_point) auf den Feature-Punkten ausführen. Wird die affine Transformation die Längen beibehalten (nur Rotation + Translation)? Dies würde ein wenig vereinfachen. – knedlsepp
Ja, es ist ein schwieriges Problem, weil es so viele lokale Minima gibt. Das Problem wurde bereits in der Literatur gelöst, aber es gibt keinen funktionierenden Code. Ich denke, die Voraussetzung ist eine gute erste Annäherung und eingeschränkte Parameter. Für eine Volume-to-Volume-Registrierung gibt es bereit Ansätze zu verwenden. Ich glaube, dass in diesem Bereich die gegenseitige Information als der beste Weg angesehen wird, die Angleichung zu bewerten, so dass ich diesen Ansatz auch hier verfolgen möchte. Wie für Ihre Frage: ja nur Rotation und Übersetzung (und Skalierung aber die Skalierung ist für mein Problem bekannt), kein Versatz. – Leo
Ich verstehe jedoch nicht, wie gegenseitige Informationen direkt anwendbar wären, da die Wahrscheinlichkeitsräume nicht identisch sind. Könnten Sie das näher ausführen? – knedlsepp