技术标签: 医学影像处理 DICOM 数据处理 MATLAB
DICOM,是医学图像和相关信息的国际标准。
常见类型有MR和CT,而它们在处理上有细微的不同。
MATLAB内置dicom库,直接调用即可。
% filename 就是你要用的DICOM文件的名字
% 不要使用其他奇怪的东西
filename = 'CT.dcm';
dcm = dicomread(filename);
info = dicominfo(filename);
参数名 | 描述 | 其他 | |
---|---|---|---|
1 | Height | 行数 | |
2 | Width | 列数 | |
3 | PixelSpacing | 像素间隔(单位:mm) | |
4 | SliceLocation | 切片位置(单位:mm) | |
5 | SpacingBetweenSlices | 层间距(单位:mm) | |
6 | RescaleIntercept | 缩放截距 | 仅CT |
7 | RescaleSlope | 缩放斜率 | 仅CT |
8 | WindowCenter | 窗位 | |
9 | WindowWidth | 窗宽 |
查看方式如下:
info.WindowCenter
info.WindowWidth
info.RescaleSlope
info.RescaleIntercept
info.PixelSpacing
info.SliceLocation
具体使用方式在后面介绍。
CT值是测定人体某一局部组织或器官密度大小的一种计量单位,通常称亨氏单位(hounsfield unit ,HU)。如空气为-1000,致密骨为+1000。
而磁共振图像的信号绝对值,不像CT有明确的物理意义。磁共振更关心不同组织之间信号的强弱对比关系。(感兴趣可自行查阅磁共振图像成像步骤)
%% 读取数据
filename = 'MR.dcm';
dcm = dicomread(filename);
info = dicominfo(filename);
dcm = double(dcm); % 转为double方便后续处理
%% 归一化处理(此处也可直接使用mat2gray()函数)
lv = min(dcm(:));
uv = max(dcm(:));
dcmIM = (dcm - lv)/(uv - lv);
%% 显示
figure
subplot(121), imagesc(dcm)
colorbar, title('原始数据')
subplot(122), imagesc(dcmIM)
colorbar, title('图像数据')
colormap gray;
2. CT
CT成像信号会转换为灰度保存在DICOM文件中,所以在使用前要先转回CT值,再根据窗位窗宽进行归一化处理。
%% 读取数据
filename = 'MR.dcm';
dcm = dicomread(filename);
dcm = double(dcm); % 转为double方便后续处理
%% 灰度转CT值
dcmCT = dcm * info.RescaleSlope + info.RescaleIntercept;
%% 调窗+归一化
% 重要的事情说一遍
% dicom默认窗宽窗位由设备和操作员决定,有时一个,有时两个,请根据自己的影像核实确认,此代码仅是示例。为了不报错,给加了一个k = 1
k = 1; % 通常有1至2个窗,但我不知道你的数据有多神奇
lv = info.WindowCenter(k) - info.WindowWidth(k)/2;
uv = info.WindowCenter(k) + info.WindowWidth(k)/2;
dcmIM = (dcmCT-lv)/info.WindowWidth(k);
dcmIM(dcmIM<0) = 0;
dcmIM(dcmIM>1) = 1;
%% 显示
figure
subplot(131),imagesc(dcm)
colorbar,title('原始数据')
subplot(132),imagesc(dcmCT)
colorbar,title('CT数据')
subplot(133),imagesc(dcmIM)
colorbar,title('图像数据')
colormap gray;
有任何问题欢迎讨论,最后还是把演示代码上传
https://download.csdn.net/download/xsz591541060/11221516
由于很简单,不推荐下载,除非你买了年VIP。
文章浏览阅读8.3k次,点赞5次,收藏12次。作为 admin 用户,请求认证令牌,输入如下命令openstack --os-auth-url http://controller:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue报错Failed to discover available identity versions whe._caused by newconnectionerror('
文章浏览阅读4.5k次。可以在桌面安装云顷还原系统软件,利用软件中的网络对拷功能部署批量对拷环境,进行电脑教室软件的批量对拷安装与增量对拷安装。_教室电脑 一起装软件
文章浏览阅读3.1k次,点赞5次,收藏7次。原文链接:https://www.ikaze.cn/article/43写这篇博文的起因是,我在论坛宣传我开源的新项目YTask(go语言异步任务队列)时,有小伙伴在下面回了一句“为什么不用nsq?”。这使我想起,我在和同事介绍celery时同事说了一句“这不就是kafka吗?”。那么YTask和nsq,celery和kafka?他们之间到底有什么不同呢?下面我结合自己的理解。简单的分析一..._任务队列和消息队列
文章浏览阅读1.5k次。1,MyUtuils.kt将被调用的文件class MyUtils { fun show(info:String){ println(info) }}fun show(info:String){ println(info)}2,Java文件调用该类,ClientJava.javapublic class ClientJava { public static void main(String[] args) { /** _java 调用kt 对象
文章浏览阅读6.6k次,点赞4次,收藏4次。在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对 像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助: 首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层. UDP属于运输层_最大请求报文大小
文章浏览阅读10w+次,点赞14次,收藏18次。代码如下:for /l %a in (0,0,1) do echo hello,world粘贴在cmd命令行窗口中,回车即可无限死循环输出hello,world。如果需要停止,可以按ctrl+c中断。解析通用形式:for /l %variable IN (start,step,end) DO command [command-parameters] 该集表示以增量形式从start到end的一个数字序列。具体到第一段代码,如果是 (0,0,1) 就是从0开始,每次增_cmd装比代码无限循环
文章浏览阅读8.5k次,点赞2次,收藏11次。使用uni-ui UI框架实现表格加分页功能,uni-table 和uni-pagination 组件的使用示例加完整代码。_uniapp table
【代码】HTML5本地存储账号密码。
文章浏览阅读1.6k次。本小结通过transition的钩子函数实现小球半场动画头条-静敏的编程秘诀-vue教程合集知识点1:入场、出厂方法beforeEnter表示动画入场之前,此时,动画尚未开始,可以在beforeEnter中设置元素开始动画之前的起始样式enter表示动画开始之后的样式,这里可是设置小球完成动画之后的,结束状态enter(el,done)el:动画钩子函数的第一个参数:el,..._transition 钩子
主要梳理mybatis多表及动态使用
文章浏览阅读2.9w次,点赞98次,收藏777次。文章目录Qt 多线程操作2.线程类QThread3.多线程使用:方式一4.多线程使用:方式二5.Qt 线程池的使用Qt 多线程操作应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其他线程进行逻辑运算,多个线程各司其职,不仅可以提高用户体验还可以提升程序的执行效率。Qt中使用多线程需要注意:Qt的默认线程为窗口线程(主线程):负责窗口事件处理或窗口控件数据的更新;子线程负责后台的业_qt 多线程
【代码】GQA分组注意力机制。