Python读取预处理DICOM文件方式详解

 更新时间:2023年03月31日 09:39:00   作者:Sayello  
这篇文章主要介绍了Python读取预处理DICOM文件方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

需要的库

●Simpleitk
安装命令:

conda install -c simpleitk simpleitk

使用:

import SimpleITK as sitk

pydicom(不推荐,可能有些文件打不开)
安装命令:

conda install -c conda-forge pydicom

●PIL
使用:

from PIL import Image

读取dicom

读取Series信息
由于患者可以同时做多个检查,所以dicom中可以包含多个study(多次检查,一般只有一个检查,所以不用管这个)和series(多个部位,一些信息也是用不同series保存),所以第一步就是要读取series信息。

在这里插入图片描述

代码:

reader = sitk.ImageSeriesReader()
ids = reader.GetGDCMSeriesIDs(dict_name)

ids里包含了所有series的id,dict_name为dicom文件所在目录路径
读取Series中所有图片
利用上面读取的series的id可以分开读取不同series。
代码:

for i in ids:
    series_file_name = reader.GetGDCMSeriesFileNames(dict_name, i)

series_file_name中包含某个series所有图片的路径,一般我们只需要图片数量最多的那个series。ids为series的id列表,dict_name为dicom文件所在目录路径。

(重点)读取meta data(元数据)
dicom文件包含大量的元数据,会指出与该次检查的相关信息,常用的有 Slice thickness(层厚), Pixel spacing(像素间距)可以根据需要读取相应的元数据。
代码:

file_reader = sitk.ImageFileReader()
file_reader.SetFileName(series_file_name[0])
file_reader.ReadImageInformation()
study_id = file_reader.GetMetaData("0008|1030")
series_file_name[0]

可以为任意dicom文件的路径,“0008|1030"为元数据的tags,详细的可以参考http://www.yuantk.com/toolkit_40.html ,或者直接搜索"dicom tag”

转换为图片并保存
代码:

image = sitk.ReadImage(series_file_name[0])
image_data = sitk.GetArrayFromImage(image)[0]
image_data = normalization(image_data)
Image.fromarray(image_data).convert("RGB").save(image_save_path)

series_file_name[0]可以为任意dicom文件的路径,使用simpleitk读取的数据已经进利用斜率和截距进行了线性变换无需二次处理。image_save_path为保存的路径,注意路径要包含文件名(例:‘./1.png’),这里的要重点关注normalization函数,该函数涉及窗口技术。

(重点)窗口技术
由于dicom存储的是CT值矩阵,由于各种组织结构或病变具有不同的CT值,因此欲显示某一组织结构细节时,应选择适合观察该组织或病变的窗宽和窗位,以获得最佳显示,这里需要利用窗口技术进行转换。窗口技术涉及两个关键参数,窗位与窗宽。
窗宽(WW):是CT图像上显示的CT值范围,在此CT值范围内的组织和病变均以不同的灰度显示,而CT值高于此范围的组织和病变,均以白影显示,不再有灰度差异;反之,低于此范围的组织结构,均以黑影显示,也无灰度差别。
窗位(WL):是窗的中心位置。
公式:

WW=CTmax-CTmin
WL=(CTmax+CTmin)/2
CTmax = WW/2+WL
CTmin = WL-WW/2

转换后的图片灰度值=(CT值-CTmin) / (CTmax - CTmin) * 255
代码:

def normalization(data, window_level=-600., window_width=2000.):
	high = window_level + window_width / 2
	low = window_level - window_width / 2
	data = (data - low) / window_width * 255
	data[data > 255] = 255
	data[data < 0] = 0
	return data

window_level和window_width根据实际需要设定,data为simpleitk读取的数据

到此这篇关于Python读取预处理DICOM文件方式的文章就介绍到这了,更多相关Python读取DICOM文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中urllib与urllib2模块的变化与使用详解

    Python中urllib与urllib2模块的变化与使用详解

    urllib是python提供的一个用于操作URL的模块,在python2.x中有URllib库,也有Urllib2库,在python3.x中Urllib2合并到了Urllib中,我们爬取网页的时候需要经常使用到这个库,需要的朋友可以参考下
    2023-05-05
  • Python绘制分类图的方法

    Python绘制分类图的方法

    这篇文章主要为大家详细介绍了Python绘制分类图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • python使用datetime模块处理日期时间及常用功能详解

    python使用datetime模块处理日期时间及常用功能详解

    datetime模块是Python标准库中用于处理日期和时间的模块,在本节中,我们将介绍datetime模块的一些常用功能,并通过实例代码详细讲解每个知识点,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-06-06
  • 对python3 一组数值的归一化处理方法详解

    对python3 一组数值的归一化处理方法详解

    今天小编就为大家分享一篇对python3 一组数值的归一化处理方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python实现光速定位并提取两个文件的不同之处

    Python实现光速定位并提取两个文件的不同之处

    如果你经常与Excel或Word打交道,那么从两份表格/文档中找到不一样的元素是一件让人很头疼的工作。本文就将以两份真实的Excel/Word文件为例,讲解如何使用Python光速对比并提取文件中的不同之处
    2022-08-08
  • Python面向对象的程序设计详情

    Python面向对象的程序设计详情

    这篇文章主要介绍了Python面向对象的程序设计详情,面向对象的程序设计在Python中具有非常重要的地位,熟练的使用面向对象编程能够为我们的Python编程提供很多的便利之处,希望您阅读完本文后能够有所收获
    2022-01-01
  • python通过第三方库操作PDF文件的几种常见方法

    python通过第三方库操作PDF文件的几种常见方法

    Python是一种高级编程语言,主要用于数据分析、机器学习、图像处理等领域,在PDF文件处理方面,Python有许多强大的库和工具,这篇文章主要给大家介绍了关于python通过第三方库操作PDF文件的几种常见方法,需要的朋友可以参考下
    2024-02-02
  • python3通过selenium爬虫获取到dj商品的实例代码

    python3通过selenium爬虫获取到dj商品的实例代码

    这篇文章主要介绍了python3通过selenium爬虫获取到dj商品的实例代码,需要的朋友可以参考下
    2019-04-04
  • 使用Python实现牛顿法求极值

    使用Python实现牛顿法求极值

    今天小编就为大家分享一篇使用Python实现牛顿法求极值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • opencv 图像礼帽和图像黑帽的实现

    opencv 图像礼帽和图像黑帽的实现

    这篇文章主要介绍了opencv 图像礼帽和图像黑帽的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论