matlab dicom矩阵,DICOM在Matlab中仿射从图像空间到患者空间的矩阵变换

好的,所以它们嵌套在可能是结构的特定于供应商的条目中.当在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方向和转换的平移

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值