Dicom文件转mhd,raw文件格式
最近在整理与回顾刚加入实验室所学的相关知识,那会主要是对DICOM这个医疗图像进行相应的研究,之前有一篇博客已经讲述了一些有关DICOM的基本知识,今天这篇博客就让我们了解一下如何将Dicom文件转为mhd,raw文件格式。
一、将Dicom文件转mhd,raw文件格式的原因
医学图像通常是通过dicom文件格式进行存储的,但为了便于读取和使用也常常将其转化为:每个病人一个mhd文件和一个同名的raw文件的格式,mhd即meta header data,数据头部信息,raw存储了像素信息。如下图所示:
二、利用python+SimpleITK完成上述过程的转换
其中mhd文件存储了dicom的头部信息,由于头部信息很多生成mhd的方法有所不同,所以这里展示了通过ITK(ITK是美国国家卫生院下属的国立医学图书馆开发的一款医学图像处理软件包,是一个开源的、跨平台的影像分析扩展软件工具。)产生mhd文件的文件内容(利用写字板打开),有以下头部信息:
以下为实现的代码,附着详细的代码注释:
复制代码
1 import cv2
2 import os
3 import pydicom
4 import numpy
5 import SimpleITK
6
7 # 路径和列表声明
8 # 与python文件同一个目录下的文件夹,存储dicom文件,该文件路径最好不要含有中文
9 PathDicom = "D:/dicom_image/V"
10 # 与python文件同一个目录下的文件夹,用来存储mhd文件和raw文件,该文件路径最好不要含有中文
11 SaveRawDicom = "D:/dicom_image/V/SaveRaw"
12 lstFilesDCM = []
13
14 # 将PathDicom文件夹下的dicom文件地址读取到lstFilesDCM中
15 for dirName, subdirList, fileList in os.walk(PathDicom):
16 for filename in fileList:
17 if ".dcm" in filename.lower(): # 判断文件是否为dicom文件
18 print(filename)
19 lstFilesDCM.append(os.path.join(dirName, filename)) # 加入到列表中
20
21 # 第一步:将第一张图片作为参考图片,并认为所有图片具有相同维度
22 RefDs = pydicom.read_file(lstFilesDCM[0]) # 读取第一张dicom图片
23
24 # 第二步:得到dicom图片所组成3D图片的维度
25 ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM)) # ConstPixelDims是一个元组
26
27 # 第三步:得到x方向和y方向的Spacing并得到z方向的层厚
28 ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
29
30 # 第四步:得到图像的原点
31 Origin = RefDs.ImagePositionPatient
32
33 # 根据维度创建一个numpy的三维数组,并将元素类型设为:pixel_array.dtype
34 ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype) # array is a numpy array
35
36 # 第五步:遍历所有的dicom文件,读取图像数据,存放在numpy数组中
37 i = 0
38 for filenameDCM in lstFilesDCM:
39 ds = pydicom.read_file(filenameDCM)
40 ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array
41 cv2.imwrite("out_" + str(i) + ".png", ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)])
42 i += 1
43
44 # 第六步:对numpy数组进行转置,即把坐标轴(x,y,z)变换为(z,y,x),这样是dicom存储文件的格式,即第一个维度为z轴便于图片堆叠
45 ArrayDicom = numpy.transpose(ArrayDicom, (2, 0, 1))
46
47 # 第七步:将现在的numpy数组通过SimpleITK转化为mhd和raw文件
48 sitk_img = SimpleITK.GetImageFromArray(ArrayDicom, isVector=False)
49 sitk_img.SetSpacing(ConstPixelSpacing)
50 sitk_img.SetOrigin(Origin)
51 SimpleITK.WriteImage(sitk_img, os.path.join(SaveRawDicom, "sample" + ".mhd"))
public class DispatcherServlet extends HttpServlet {
private Properties contextConfigProperties = new Properties();
private List<String> classNames = new ArrayList<>();
private Map<String, Object> ioc = new HashMap<String, Object>();
private Map<String, Method> handlerMappings = new HashMap<>();
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
dispatcher(req,resp);
} catch (Exception e) {
resp.getWriter().write("500 Server has an error"+Arrays.toString(e.getStackTrace()));
}
}
private void dispatcher(HttpServletRequest req, HttpServletResponse resp) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
if (this.handlerMappings.isEmpty()) {
return;
}
String url = req.getRequestURI();
String contextPath =baihuiyulegw.com req.getContextPath();
url.replace(contextPath, ""www.yunsengyule.com).replaceAll("/+", "/");
if (!this.handlerMappings.containsKey(url)) {
resp.getWriter().write("404 Page Not Found! ");
return;
}
Method method = this.handlerMappings.get(url);
Map<String,String[]> parameterMap = req.getParameterMap();
String beanName = this.lowerFirstLetter(method.getDeclaringClass().getSimpleName());
Object obj = this.ioc.get(beanName);
if (!parameterMap.containsKey(www.mmingyLgw.com"name")) {
resp.getWriter().write("handerMapping Not Found!");
return;
}
method.invoke(obj, new Object[] {req,resp,parameterMap.get("name")[0]});
}
@Override
public void init(ServletConfig config) throws ServletException {
//加载配置
loadConfig(config.getInitParameter("contextConfigLocation"));
//扫描指定包下的所有类
scannerClass(this.contextConfigProperties.getProperty("scanPackage"));
//初始化容器
initIoc();
//自动注入
autoWiredInstance();
//初始化处理映射
initHanderMapping(www.yongshi123.cn);
System.out.println("mvc init over...");
}
private void initHanderMapping() {
if (this.ioc.isEmpty()) {
return;
}
try {
for (Map.Entry<String, Object> en : this.ioc.entrySet()) {
boolean present = en.getValue().getClass().isAnnotationPresent(Controller.class);
if (present) {
StringBuffer baseUrl = new StringBuffer(www.mumingyue.cn);
RequestMapping requestMapping = en.getValue(www.fengshen157.com/).getClass().getAnnotation(RequestMapping.class);
baseUrl.append(requestMapping.value());
Method[] methods www.douniu2.cc= en.getValue().getClass().getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(RequestMapping.class)) {
RequestMapping mapping = method.getAnnotation(RequestMapping.class);
String fullUrl = ("/"+baseUrl.append(www.tscdeLu.cn"/").append(mapping.value().trim()).toString()).replaceAll("/+", "/");
this.handlerMappings.put(fullUrl, method);
复制代码
Dicom文件转mhd,raw文件格式相关推荐
- dicom文件转raw以及mhd时一些注意事项总结
1.一个dicom 文件里的SOPInstanceUID与MediaStorageSOPInstanceUID是相等的.类似的SOPClassUID与MediaStorageSOPClassUID也是 ...
- 医学图像NIFTI(.nii)转换为mhd、raw文件格式
文章目录 NIFTI(.nii)文件格式 mhd.raw文件格式 python代码实现 NIFTI(.nii)文件格式 Nifti 格式最初是为神经影像学发明的.神经影像信息学技术计划(NIFTI)将 ...
- 医学图像处理入门知识 | 格式DICOM,MHD+RAW | 坐标系 | ITK-SNAP | 重采样
医学图像处理入门知识 引言 常见的医学图像格式 DICOM mhd+raw 坐标系 世界坐标体系 解剖学坐标体系 图像坐标体系 这三个坐标体系有什么关系呢?怎样转换呢? ITK-SNAP工具使用 基本 ...
- 如何根据一个.raw文件还原为一个dicom文件
本文由Markdown语法编辑器编辑完成. 1. 需求背景 已知已经获取到了一幅dicom医学图像的像素文件, 它的格式为.raw文件. 由于市面上通用的dicom viewer软件, 都只能识别di ...
- Unity 读取DICOM文件,并支持移动端
本文参考网上大神的源码,在此基础上修改,适配Unity,并支持移动端,本文代码支持安卓端,ios端请各位自行适配,原理不变,只是在数据读取的方法上可以有点区别. 大神原贴:医学影像调窗技术 - ass ...
- 医学图像处理——数据预处理(.mhd+raw格式图像读取和显示)
数据预处理(.mhd+raw格式图像读取和显示) 说明: 1.mhd+raw背景 2..mhd说明图像数据的信息 3.Python读取和显示mhd图像数据 3.1python库的安装 3.1代码运行展 ...
- 【转】【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件
转自:https://developer.aliyun.com/article/672065 最近研究了一下DICOM和BMP文件转换的问题,也是很头大.度娘了很久,也在CSDN等论坛看到一些断断续续 ...
- 【转】Dicom文件解析!!!!!!
转自:https://blog.csdn.net/leaf6094189/article/details/8510325 Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*. ...
- c#如何wmf图片转换成png图片_【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件-阿里云开发者社区...
最近研究了一下DICOM和BMP文件转换的问题,也是很头大.度娘了很久,也在CSDN等论坛看到一些断断续续的文件,最主要的是代码只是片断,不是完整的实现.头大了. 首先,了解一下BMP文件格式,BMP ...
最新文章
- Linux思维导图整理,你确定不收藏?
- Homestead 使用总结
- 21-while里的break简单用法
- MapReduce简述
- 前端学习(1494):表格案例--axios-搜索功能
- html5怎么删除样式,css怎么删除一个样式
- 【51NOD】1006 最长公共子序列Lcs(动态规划)
- vue2 枚举类型转换
- Git使用手册:HTTPS和SSH方式的区别和使用
- 技术解读丨GaussDB数仓高可用容灾利器之逻辑备份
- BZOJ 1502:月下柠檬树
- Appcan性能低?速度慢?UI难看?与apicloud用数据说话
- Python 编写自动化工具
- IC芯片卡读写类(泛型模式)
- 单机 弱联网手游 防破解 金币修改 简单措施
- 为什么你的努力可能是没用的?
- 【Spark NLP】第 15 章:聊天机器人
- 如何想领导说清楚DCMM到底有什么好处?
- SpringBoot项目中华为云 内容审核的使用(内附代码)
- JavaScript-百炼成仙(第1节掌握JavaScript基础1.1-1.21)
热门文章
- JS函数传参时:值传递与引用传递的区别
- c语言编辑编译链接,C语言的“编译、链接”
- 【jQuery】removeAttr(name)和removeClass(class)
- Android图表控件MPChart-柱状+折线组合图表基本使用
- 今日头条推广视频教程自媒体推广短视频教程今日头条引流小白入门 视频解析下载支持今日头条快手抖...
- php使用smtp发送邮件,php使用smtp发送邮件
- 35.Python修炼之路【40-视图】2018.06.05
- 用Gitlab进行强制代码Review
- 八种你必须警惕的数据中心人身安全隐患
- particles.js粒子特效(常用登录页背景)