好的,所以它们嵌套在可能是结构的特定于供应商的条目中.当在Matlab中加载时,嵌套的名称是inf.PerFrameFunctionalGroupsSequence.Item_X.,然后是framenumber,然后是一些更直接/自我解释的嵌套,所以我不需要在这里添加它.但是在那里搜索你需要的条目.切片间距称为SpacingBetweenSlices(或单切片情况下的切片厚度),像素间距称为PixelSpacing,然后有ImagePositionPatient用于平移,ImageOrientationPatient用于旋转.下面是我按照下面的nipy链接中的步骤编写的代码.
会发生什么情况是在旋转矩阵中加载direction cosines以对齐基矢量,然后在矩阵中加载像素间距和切片间距以缩放基矢量,并加载图像位置以平移新坐标系.找到z方向的直接余弦需要一些计算,因为dicom显然是为2d图像设计的.在单切片情况下,z方向余弦是与x和y方向余弦(两者之间的叉积)正交的单位向量,并且在多切片情况下,您可以根据间隙之间的平移中的所有差异来计算它.在此之后你仍然想要apply the transformation,这也不是直接的直截了当.
%load the header
inf = dicominfo(filename, 'dictionary', yourvendorspecificdictfilehere);
nSl = double(inf.MRSeriesNrOfSlices);
nY = double(inf.Height);
nX = double(inf.Width);
T1 = double(inf.PerFrameFunctionalGroupsSequence.Item_1.PlanePositionSequence.Item_1.ImagePositionPatient);
%load pixel spacing / scaling / resolution
RowColSpacing = double(inf.PerFrameFunctionalGroupsSequence.Item_1.PixelMeasuresSequence.Item_1.PixelSpacing);
%of inf.PerFrameFunctionalGroupsSequence.Item_1.PrivatePerFrameSq.Item_1.Pixel_Spacing;
dx = double(RowColSpacing(1));
dX = [1; 1; 1].*dx;%cols
dy = double(RowColSpacing(2));
dY = [1; 1; 1].*dy;%rows
dz = double(inf.SpacingBetweenSlices);%inf.PerFrameFunctionalGroupsSequence.Item_1.PrivatePerFrameSq.Item_1.SliceThickness; %thickness of spacing?
dZ = [1; 1; 1].*dz;
%directional cosines per basis vector
dircosXY = double(inf.PerFrameFunctionalGroupsSequence.Item_1.PlaneOrientationSequence.Item_1.ImageOrientationPatient);
dircosX = dircosXY(1:3);
dircosY = dircosXY(4:6);
if nSl == 1;
dircosZ = cross(dircosX,dircosY);%orthogonal to other two direction cosines!
else
N = nSl;%double(inf.NumberOfFrames);
TN = double(-eval(['inf.PerFrameFunctionalGroupsSequence.Item_',sprintf('%d', N),'.PlanePositionSequence.Item_1.ImagePositionPatient']));
dircosZ = ((T1-TN)./nSl)./dZ;
end
%all dircos together
dimensionmixing = [dircosX dircosY dircosZ];
%all spacing together
dimensionscaling = [dX dY dZ];
%mixing and spacing of dimensions together
R = dimensionmixing.*dimensionscaling;%maps from image basis to patientbasis
%offset and R together
A = [[R T1];[0 0 0 1]];
%you probably want to switch X and Y
%(depending on how you load your dicom into a matlab array)
Aold = A;
A(:,1) = Aold(:,2);
A(:,2) = Aold(:,1);
这导致了这个仿射公式:
所以基本上我遵循了this教程.最大的困难是让Z方向和翻译正确.找到识别和转换正确的条目对我来说并不简单.我确实认为我的答案在该教程中添加了一些内容,因为很难找到它们所引用的条目,现在我写了一些Matlab代码从DICOM标题中获取仿射矩阵.在使用找到的仿射矩阵之前,您可能还需要找到所有帧的Z坐标,如果您的数据集具有四个以上的维度,那么这可能并不简单(dicomread将所有更高的维度放在one big fourth dimension中)
-编辑-修正了Z方向和转换的平移