使用Python解决常见格式图像读取nii,dicom,mhd
作者:派大大大星? 发布时间:2021-11-14 23:36:59
1. raw,mhd 格式医学图像数据转换
raw+mhd格式是常见的一种医学图像格式,每一个病人的数据包含一个mhd文件和一个同名的raw文件,mhd即meta header data,数据头部信息,而raw存储了像素信息。方法需要使用的SimpleITK库,我们需要在自己的Python环境中安装对应的库
pip install SimpleITK
mhd+raw的数据往往是三维体数据,我们可以从mhd文件中读取数据的具体信息如图像大小、切片大小、像素大小等信息。使用sitk.ReadImage() 即可读取图像,使用sitk.GetArrayFromImage() 可获取图像矩阵。
具体代码如下:
import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
from natsort import natsorted
from tqdm import tqdm
import cv2
import numpy as np
mhd_path = './xxx.mhd' # mhd文件需和同名raw文件放在同一个文件夹
data = sitk.ReadImage(mhd_path) # 读取mhd文件
# print(data)
spacing = data.GetSpacing() # 获得spacing大小
img_data = sitk.GetArrayFromImage(data) # 获得图像矩阵
print(img_data.shape)
# 图像数据转换为npy保存
np.save('img_data.npy', np.array(img_data))
# 将图像转为png格式保存
for i in range(img_data.shape[0]):
cv2.imwrite('./{}.png'.format(i), img_data[i, :, :])
2. dicom格式医学图像数据转换
DICOM(Digital Imaging and Communications in Medicine) 即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用。所有患者的医学图像都以 DICOM 文件格式进行存储。使用Python读取dicom图像可以使用pydicom库和SimpleITK库来完成。由于在医学图像处理领域中,对不同的图像需要使用不同的窗宽窗位导出图像,在下面代码中,我增加了对应的代码。
pip install SimpleITK
pip install pydicom
使用pydicom方法具体代码如下:
import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
from natsort import natsorted
from tqdm import tqdm
import cv2
import pydicom
import numpy as np
#调整图像窗宽窗位
def window_transform(ct_array, window_width, window_center, normal=False):
min_window = float(window_center) - 0.5*float(window_width)
new_img = (ct_array - min_window) / float(window_width)
new_img[new_img < 0] = 0
new_img[new_img > 1] = 1
if not normal:
new_img = (new_img * 255).astype('uint8')
return new_img
img_path = 'xx.dcm'
#此时读取的是所有dicom图像信息
image = pydicom.read_file(img_path)
#获得图像矩阵
image_data = image.pixel_array
#获得dicom中的患者信息、图像信息等
information['PatientID'] = image.PatientID
information['PatientName'] = image.PatientName
information['PatientBirthDate'] = image.PatientBirthDate
information['PatientSex'] = image.PatientSex
window_width = 1000
window_center = 30
image_data = window_transform(image_data, window_width, window_center, normal=False)
cv2.imwrite('./img.png',image_data)
使用SimpleITK方法具体代码如下:
import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
from natsort import natsorted
from tqdm import tqdm
import cv2
import pydicom
import numpy as np
img_path = 'xx.dcm'
#此时读取的是所有dicom图像信息
image = sitk.ReadImage(img_path)
# 转为值为0-255的灰度图
rescalFilt = sitk.RescaleIntensityImageFilter()
rescalFilt.SetOutputMaximum(255)
rescalFilt.SetOutputMinimum(0)
image = rescalFilt.Execute(image)
image_data = sitk.GetArrayFromImage(image_data)
image_data = np.squeeze(dicom_data)
cv2.imwrite('./img.png',image_data)
3. nii格式医学图像转换
医学影像早期使用的是DICOM标准,基本上各家厂商都会使用符合DICOM标准的产品,但是这个标准对于数据分析并不方便。在神经影像兴起时就诞生了各种各样的数据存储标准,比如analyze。后为了便于学术交流,NIH拉着其他一些组织的专家成立了工作组,制定了新的神经影像的数据存储标准,称为NIFTI。 读取nii后缀的NIFTI格式图像需要安装nibabel库
pip install nibabel
使用nib.load() 函数即可读取图像数据data, 其中dataobj就是图像矩阵
import os
import numpy as np
import nibabel as nib
import matplotlib.pyplot as plt
from glob import glob
img_path = './xxx.nii'
image = nib.load(img_path)
image_data = image.dataobj
for i in range(0, dataobj.shape[2]):
cv2.imwrite('./{}.png'.format(i), img_data[i, :, :])
来源:https://juejin.cn/post/7026670545164845070


猜你喜欢
- 本文实例讲述了JS实现向表格行添加新单元格的方法。分享给大家供大家参考。具体如下:下面的JS代码可以想表格中指定id的行插入新的单元格<
- 简介在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找
- 效果图:代码如下:<!DOCTYPE html><html lang="en"><head
- 先说结论model.state_dict()是浅拷贝,返回的参数仍然会随着网络的训练而变化。应该使用deepcopy(model.state
- 本文实例讲述了MySQL中ROUND函数进行四舍五入操作陷阱。分享给大家供大家参考,具体如下:在MySQL中, ROUND 函数用于对查询结
- 写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下。方便使用1. C++ 读取文件#include<stdio
- 一、必备插件🌾Chinese(中文)安装后,按快捷键Ctrl+Shift+P,输入configure languageSettings Sy
- 使用ASP设置指定站点CPU最大使用程度'=============================================
- 本文为大家分享了mysql8.0下载与安装,供大家参考,具体内容如下首先要做的是下载8.0版本的mysql,可以到官网上去下,直接百度搜索m
- 尽管Flask的request对象提供的支持足以处理web表单,但依然有许多任务会变得单调且重复。表单的HTML代码生成和验证提交的表单数据
- 1,phpthumb_ico 是生成ICO图标的类,源码如下class phpthumb_ico {function phpthumb_ic
- 导语:哈喽,哈喽~小编不知道你有没有经历过,想联系一位很长时间没有联系的朋友,发现对方很早以前已经把你删除了,而你还一无所知。反正小编经历过
- 求解三角形第三边长import mathx=input('输入两边长及夹角(度):')#输入时候使用空格分隔3个值a,b,t
- 一、Mysql事务概念MySQL 事务主要用于处理操作量大,复杂度高的数据。由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执
- 我们有时候看到一些文章因为一行的字符超长而把一些表格或DIV撑开或字符写到溢出了.如何防止表格防止撑开,表格不被内容撑开,单行字符超长div
- 判断不仅包括电脑浏览器,还包括安卓、ios系统的手机以及平板电脑,游戏系统 var client = function(){ //呈现引擎
- 每天都要记得健康打卡尊敬的老师,我忘了这次的健康打卡,反思的时候我想了很多东西,反省了很多事情,自己也很懊悔,触犯了学校的规定,深刻认识到自
- 一、创建数据库创建sqlite数据库的代码import sqlite3conn = sqlite3.connect("test.d
- element-UI el-table树形数据 修改小三角图标el-table树形数据 默认样式有下级没展开是▸ 有下级展开了是▾ 没有下级
- 经常写 shell 脚本知道,字符串判断可以用 =,!= 数字的判断是 -eq,-ne 等,但是 Python 确不是这样子的。所以作为慢慢