matlab 数组中的 DICOM 维度(所有帧都以数组的最后一个维度结束)

2024-04-15

在我的 GUI 之一中,我加载 DICOM 图像。有时它们只是一个体积和另一个维度,当我将它们加载到 Matlab 中时,一切都会到达我想要的位置。

handles.inf = dicominfo([filepath filename]);
handles.dat = dicomread(handles.inf);
size(handles.dat)

ans = 128 128 128 512

例如,对于 512 个时间点的 128 x 128 x 128 体积(实际上第三维甚至不是 128,第三维是堆栈,我不知道它是什么)。然而有时dicom中有更多维度,但读者只是将它们全部放在第四维度中。

handles.inf = dicominfo([filepath filename]);
handles.dat = dicomread(handles.inf);
size(handles.dat)

ans = 128 128 1  4082

例如,对于具有 512 个时间点的单个 128 x 128 切片、两个回波以及幅度、相位、实部和虚部数据。

那么就很难解读它们。我可以手动为加载的每个 DICOM 执行此操作,但在 GUI 中时,我希望有一种通用方法,只需在数组中为 dicom 中的每个维度创建一个维度。

这不仅对于数据分析尤其重要,而且对于转换 https://stackoverflow.com/questions/21759013/dicom-affine-matrix-transformation-from-image-space-to-patient-space-in-matlab从图像空间到患者空间的坐标。我自己的方法是查看标题,但不能保证某些条目会起作用,而且我找不到它们的应用顺序。到目前为止我找到的标题条目:

inf.Rows;%inf.width;%inf.MRAcquisitionFrequencyEncodingSteps;%inf.MRAcquisitionPhaseEncodingStepsInPlane
inf.Columns;% inf.height; % inf.NumberOfKSpaceTrajectories;
inf.MRSeriesNrOfSlices
inf.MRSeriesNrOfEchoes
inf.MRSeriesNrOfDynamicScans
inf.MRSeriesNrOfPhases
inf.MRSeriesReconstructionNumber % not sure about this one
inf.MRSeriesNrOfDiffBValues
inf.MRSeriesNrOfDiffGradOrients
inf.MRSeriesNrOfLabelTypes

reshapeddat = reshape(dat, [all dimension sizes from header here]);

我不确定如何检查是否拥有所有变量以及重塑的正确顺序。有人知道从 DICOM 标头获取所有尺寸大小及其堆叠顺序的可靠方法吗?


好的,我现在手动检查所有可能的维度。当堆栈还包含维度小于其余数据的重构数据时,请首先删除这些数据。

这是我检查尺寸的方法:

info = dicominfo(filename);
datorig = dicomread(filename);

%dimension sizes per frame
nrX = double(info.Rows);              %similar nX;% info.width;% info.MRAcquisitionFrequencyEncodingSteps;% info.MRAcquisitionPhaseEncodingStepsInPlane
nrY = double(info.Columns);           %similar nY;% info.height;% info.NumberOfKSpaceTrajectories;

%dimensions between frames
nrEcho = double(info.MRSeriesNrOfEchoes);
nrDyn = double(info.MRSeriesNrOfDynamicScans);
nrPhase = double(info.MRSeriesNrOfPhases);
nrSlice = double(info.MRSeriesNrOfSlices);           %no per frame struct entry, calculate from offset.

%nr of frames
nrFrame = double(info.NumberOfFrames);

nrSeq = 1;                                   % nSeq not sure how to interpret this, wheres the per frame struct entry?
nrBval = double(info.MRSeriesNrOfDiffBValues);        % nB
nrGrad = double(info.MRSeriesNrOfDiffGradOrients);    % info.MRSeriesNrOfPhaseContrastDirctns;%similar nGrad?
nrASL = 1;                                   % info.MRSeriesNrOfLabelTypes;%per frame struct entry?

imtype = cell(1, nrFrame);
for ii = 1:nrFrame
    %imtype(ii) = eval(sprintf('info.PerFrameFunctionalGroupsSequence.Item_%d.PrivatePerFrameSq.Item_1.MRImageTypeMR', ii));
    imtype{ii} = num2str(eval(sprintf('info.PerFrameFunctionalGroupsSequence.Item_%d.PrivatePerFrameSq.Item_1.MRImageTypeMR', ii)));
end

imType = unique(imtype, 'stable');
nrType = length(imType);

这就是我重新格式化尺寸的方法:

%% count length of same dimension positions from start
if nrEcho > 1
    for ii = 1:nrFrame
        imecno(ii) = eval(sprintf('inf.PerFrameFunctionalGroupsSequence.Item_%d.PrivatePerFrameSq.Item_1.EchoNumber', ii));
    end
    lenEcho = find(imecno ~= imecno(1), 1, 'first') - 1;
else
    lenEcho = nrFrame;
end

if nrDyn > 1
    for ii = 1:nrFrame
        imdynno(ii) = eval(sprintf('inf.PerFrameFunctionalGroupsSequence.Item_%d.PrivatePerFrameSq.Item_1.TemporalPositionIdentifier', ii));
    end
    lenDyn = find(imdynno ~= imdynno(1), 1, 'first') - 1;
else
    lenDyn = nrFrame;
end

if nrPhase > 1
    for ii = 1:nrFrame
        imphno(ii) = eval(sprintf('inf.PerFrameFunctionalGroupsSequence.Item_%d.PrivatePerFrameSq.Item_1.MRImagePhaseNumber', ii));
    end
    lenPhase = find(imphno~=imphno(1), 1, 'first') - 1;
else
    lenPhase = nrFrame;
end


if nrType > 1
    q = 1;
    imtyno(1, 1) = q;
    for ii = 2:nrFrame        
        if imtype{:, ii-1} ~= imtype{:, (ii)}
            q = q+1;
        end
        imtyno(1, ii) = q;
        %for jj = 1:nrType
            %if imtype{:,ii} == imType{:,jj} 
            %    imtyno(1, ii) = jj;
            %end
        %end
    end
    if q ~= nrType
        nrType = q;
    end
    lenType = find(imtyno ~= imtyno(1), 1, 'first') - 1;
else
    lenType = nrFrame;
end

% slices are not numbered per frame, so get this indirectly from location
% currently not sure if working for all angulations
for ii = 1:nrFrame
    imslice(:,ii) =  -eval(['inf.PerFrameFunctionalGroupsSequence.Item_',sprintf('%d', ii),'.PlanePositionSequence.Item_1.ImagePositionPatient']);
end

% stdsl = std(imslice,[],2); --> Assumption
% dirsl = max(find(stdsl == max(stdsl)));
imslices = unique(imslice', 'rows')';
if nrSlice > 1
    for ii = 1:nrFrame
        for jj = 1:nrSlice
            if imslice(:,ii) == imslices(:,nrSlice - (jj-1)); %dirsl or :?
                imslno(1, ii) = jj;
            end
        end
    end
    lenSlice = find(imslno~=imslno(1), 1, 'first')-1;
else
    lenSlice = nrFrame;
end

if nrBval > 1
    for ii = 1:nrFrame
        imbno(ii) = eval(sprintf('inf.PerFrameFunctionalGroupsSequence.Item_%d.PrivatePerFrameSq.Item_1.MRImageDiffBValueNumber', ii));
    end
    lenBval = find(imbno~=imbno(1), 1, 'first') - 1;
else
    lenBval = nrFrame;
end

if nrGrad > 1
    for ii = 1:nrFrame
        imgradno(ii) = eval(sprintf('inf.PerFrameFunctionalGroupsSequence.Item_%d.PrivatePerFrameSq.Item_1.MRImageGradientOrientationNumber', ii));
    end
    lenGrad = find(imgradno~=imgradno(1), 1, 'first')-1;
else
    lenGrad = inf.NumberOfFrames;
end

lenSeq = nrFrame; % dont know how to get this information per frame, in my case always one
lenASL = nrFrame; % dont know how to get this information per frame, in my case always one

%this would have been the goal format
goaldim = [nrSlice nrEcho nrDyn nrPhase nrType nrSeq nrBval nrGrad nrASL];             % what we want
goallen = [lenSlice lenEcho lenDyn lenPhase lenType lenSeq lenBval lenGrad lenASL];    % what they are

[~, permIX] = sort(goallen);

dicomdim = zeros(1, 9);
for ii = 1:9
    dicomdim(1, ii) = goaldim(permIX(ii));
end

dicomdim = [nrX nrY dicomdim];
%for any possible zero dimensions from header use a 1 instead
dicomdim(find(dicomdim == 0)) = 1;

newdat = reshape(dat, dicomdim);

newdim = size(newdat);
newnonzero = length(newdim(3:end));
goalnonzero = permIX(1:newnonzero);
[dummyy, goalIX] = sort(goalnonzero);
goalIX = [1 2 goalIX+2]; 
newdat = permute(newdat, goalIX);
newdat = reshape(newdat, [nrX nrY goaldim]);

当我将其作为函数使用了较长时间并对其进行了一些调试后,我可能会在 mathworks 的文件交换中发帖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab 数组中的 DICOM 维度(所有帧都以数组的最后一个维度结束) 的相关文章

  • 将文本文件读入 char 数组。 C++ ifstream

    我试图将整个 file txt 读入字符数组 但遇到一些问题 请提出建议 ifstream infile infile open file txt char getdata 10000 while infile eof infile get
  • Jquery:获取数字数组中的最大值[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 使用jquery 如何获得数组或数字
  • 删除数组中的第 m 个元素

    给定一个大小为 n 的数组 我需要编写一个函数 删除数组中的每个 m 个元素 直到数组中仅存在一个元素并返回该值 有人可以给我提示吗 听起来你正试图解决这个问题约瑟夫问题 http en wikipedia org wiki Josephu
  • 如何将数据存储在对象的对象列表中?

    我有以下代码 将年龄相同且得分最高的用户分组 我现在有而不是Map
  • 如何在 Perl 中序列化数组引用数组?

    Perl 有很多用于序列化数据的模块 我不知道该选择哪一个 我需要将以下数据序列化为字符串 以便将其放入数据库中 my categories Education Higher Education Colleges Schooling Col
  • 将数组大小定义为用户输入的变量合法吗?

    我认为数组的大小应该是恒定的 我在 VS 2019 中编写代码 甚至当我执行以下操作时 const int size 5 int number size 我会收到这个错误expression must have a constant val
  • 为什么`.forEach`适用于密集数组但不适用于稀疏数组? [复制]

    这个问题在这里已经有答案了 我试图理解 空 稀疏数组之间的区别 例如new Array 3 和一个等效的 空 密集数组 具有 3 个未定义条目的数组 我可以通过以下两种方式创建一个包含 3 个未定义值的数组 var sparse new A
  • 如何从对象文字数组中切片数组?

    我有这个数组 其中每个索引都包含一个对象文字 所有对象字面量都具有相同的属性 某些对象文字对于给定属性具有相同的值 我想创建一个包含only那些对象文字 我的想法是对数组进行排序 并将其切片成一个新数组 这是数组 var arr arr 0
  • python 求数组中正数之和的函数

    我需要编写一个函数 它接受一个数字数组并找到所有数字的最大和 换句话说 我需要找到正数的总和 我写了这个 我收到 列表超出范围 想法 def maximum sub A x 0 i 0 for i in A while A i gt 0 x
  • 如何在 MATLAB 中创建带有分级标记颜色的散点图?

    我想在 MATLAB 中绘制一个简单的散点图 标记颜色从光谱的一端到另一端各不相同 例如红色 橙色 黄色 蓝色 紫色 我的数据比较了一段时间内河流的水量和水质 3 个简单的列 时间 水量 质量 我想绘制数量与质量的 x y 散点图 但颜色随
  • c++ 如何释放和删除指向对象的指针的二维数组

    在SO问题 如何在C 中分配指针的二维数组 1 中 接受的答案还说明了如何取消分配和删除所述数组的正确过程 即 小心删除包含的指针 行数组和列数组全部分开且顺序正确 因此 我已经在元胞自动机模拟程序中成功地使用了这个二维阵列 但是 我无法使
  • 使用JS求数组的平均值[重复]

    这个问题在这里已经有答案了 我一直在寻找 但没有找到关于堆栈溢出的简单问题和答案来寻找数组的平均值 这是我拥有的数组 const grades 80 77 88 95 68 我首先想到这个问题的答案是这样的 let avg grades g
  • 编写代码来处理单词列表并删除单词中的所有空格

    该代码应该检查字符串数组并查看单词之间是否有空格 这是一个例子 every near ing checking food stand value 应改为hold every nearing checking food stand value
  • 将数组分成两半,数组总和相等或近似相等

    Problem 具有数值的数组需要分成两半 数组总和大约相等或可能相等 数组中元素的数量或顺序并不重要 probabilites array 0 4 0 15 0 1 0 1 0 2 0 2 0 3 1 45 probabilites 0
  • PHP - 计算特定数组值

    如何计算数组中值等于常量的元素的数量 例子 myArray array Kyle Ben Sue Phil Ben Mary Sue Ben 如何直接知道里面有多少个 Ben array array Kyle Ben Sue Phil Be
  • 如何在Matlab脚本中将泰勒级数系数存储到数组中

    这个问题是在 m 脚本的上下文中 我知道如何获取函数的泰勒级数 但我没有看到任何命令允许将级数的系数存储到数组中 sym2poly似乎不起作用 如何将系数存储到数组中 例如这个函数 syms x f 1 x 2 4 x 9 我们怎样才能得到
  • PHP 按值合并数组以获得 2 个不同的数组值

    我尝试将两个不同的数组合并为一个数组 有人可以帮我吗 我有这样的数组 0 Array 2 rank 579 id 1 1 Array 4 rank 251 id 2 0 Array 2 size S rank 251 1 Array 15
  • 在 Matlab 2014b 中移动等高线图的 z 值

    我正在尝试绘制曲面图 在曲面下方我希望显示轮廓线 但我希望轮廓位于z 1而不是默认值0 我找到了之前关于这个问题的帖子here https stackoverflow com questions 8054966 matlab how to
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • php 数组用重音符号排序

    我用它来根据姓氏排序 usort fb friends data custom sort function custom sort a b return a last name gt b last name foreach fb frien

随机推荐

  • 如何检查 Perl 中打开(文件)是否成功?

    下面的代码 不太像 Perl 风格 usr bin perl if e mydir print directory doesn t exist n open my fh gt mydir file txt if fh print file
  • 设置 npm 注册表 URL 的用户名和密码

    我正在尝试使用 npm 从 url 安装软件包 http 主机 80 http host 80 我做了以下事情 npm 配置设置 strict ssl false npm 配置设置注册表 npm 代理http 主机 端口 http host
  • JavaScript - 控制 document.write 的插入点

    我想创建一个运行第三方脚本的页面 其中包括document write当 DOM 已经完全加载之后 我的页面不是 XHTML 我的问题是 document write 正在覆盖我自己的页面 这就是 DOM 加载后它所做的事情 我尝试重写 d
  • 使用谷歌地图 API iOS 进行反向地理编码

    我正在使用以下代码进行反向地理编码 void locationManager CLLocationManager manager didUpdateToLocation CLLocation newLocation fromLocation
  • Facebook API 人物搜索按国家/地区过滤

    我正在尝试使用 Facebook API Graph API 或 FQL 以有效者为准 搜索人员 到目前为止 它工作得很好 但我无法按国家或语言对其进行过滤 我目前正在检索此网址 https graph facebook com searc
  • 无法分配给变量,因为它是借用的

    我试图在循环中重新分配变量 但我不断遇到cannot assign to cur node because it is borrowed 下面为了简单起见我注释掉了循环 这是同样的问题 我该如何处理这个问题 fn naive largest
  • Java 未知格式转换异常

    下面的代码引发了这个错误 我不知道为什么 将 String format 输出到str变量 但我不知道它出了什么问题 Exception in thread main java util UnknownFormatConversionExc
  • Android 中的屏幕截图

    我想开发一个应用程序来截取 android 屏幕的屏幕截图 有人知道怎么做吗 这类似于 koushik duttas 屏幕截图 但是没有使用 root 并且有人有 koushik dutta 屏幕截图应用程序正在运行 不适合我 请让我知道
  • Kubernetes Dashboard 在整个网站上都是“被禁止的”

    我在 Kubernetes 的仪表板网站上到处都看到 被禁止 见图 重现 通过站点而不是从 shell 创建 Google Kubernetes 集群 选择 Kubernetes 版本 1 8 6 通过连接按钮打开外壳 gcloud con
  • Autobahn websockets Android 演示崩溃

    我是 websockets 的新手 我一直在使用 Autobahn websocket 来制作一个更大的项目 它在 python 和 js 版本中工作得很好 但我在 Android API 上遇到了麻烦 我正在遵循中的教程http www
  • 取消任务关闭窗口。如何检测任务是否同步返回?

    我遵循一种相当常见的模式 使用异步对话框方法确认 取消主窗口关闭 但是 在我调用来呈现对话框的异步任务中 在某些情况下我会立即返回布尔值 而不是等待对话框任务方法的返回 在这些情况下会抛出异常 System InvalidOperation
  • WPF/XAML:如何使 TextBlock 中的所有文本大写?

    我希望 TextBlock 中的所有字符都以大写形式显示
  • 无法使用 iframe 标签在 WebView 中播放视频?

    我正在使用以下数据来显示WebView 这些是 HTML 标签以及 指的是视频的 iframe 现在的问题是 当我点击它时 它显示播放按钮 但无法播放视频 我可以在里面播放这个视频吗WebView or not lt p gt lt p g
  • 反汇编中演示 volatile 的示例 C 代码?

    演示反汇编中易失性和非易失性之间差异的简短说明性 C 程序是什么 ie int main volatile int x vs int main int x 我们可以用什么来代替两者 这样生成的代码就不同了 例如 x 0 If x is no
  • 从原始 r 和 s 创建 DER 格式的 ECDSA 签名

    我有一个原始 ECDSA 签名 R 和 S 值 我需要 DER 编码版本的签名 有没有一种直接的方法可以使用 c 接口在 openssl 中执行此操作 我目前的尝试是使用i2d ECDSA SIG const ECDSA SIG sig u
  • 单选按钮选中更改事件触发两次

    请阅读我的问题 它不是重复的问题 我在 Windows 窗体上有三个单选按钮 所有这些按钮都具有关联的常见 CheckedChanged 事件 当我单击任何这些单选按钮时 它会触发 CheckedChanged 事件两次 这是我的代码 pr
  • 什么可能导致 ASP.NET 应用程序忘记用户?

    我有一个 ASP NET 应用程序 它似乎在一段时间后忘记了用户已登录 我正在使用会员资格提供商 当选择 记住 登录时 它会在会话期间记住它 我什至可以关闭浏览器 重新启动并返回 它仍然会登录 但过了一段时间它就会忘记 而且似乎在任何旧时间
  • 在 ASP.NET 3.5 中创建 RSS 源

    如何使用 C 在 ASP NET 3 5 中创建 RSS 提要 哪些框架部分可以帮助 NET 开发人员更轻松地发布 RSS 或 Atom 提要 NET 4 中是否有任何额外功能可以使此任务比 3 5 中更容易 3 5 中有一个新的命名空间
  • 如何限制拖动元素在interact.js中重叠

    容器中的拖动元素不应该重叠 我们如何限制 请帮忙 交互API链接 http interactjs io 抱歉 没有尽早回答这个问题 我相信你必须手动检查元素的顶部 底部 左侧和右侧边缘的位置 所以这就是我所做的 Call this func
  • matlab 数组中的 DICOM 维度(所有帧都以数组的最后一个维度结束)

    在我的 GUI 之一中 我加载 DICOM 图像 有时它们只是一个体积和另一个维度 当我将它们加载到 Matlab 中时 一切都会到达我想要的位置 handles inf dicominfo filepath filename handle