Dicom 医学图像与 nii 标签数据处理
Dicom 医学图像与 nii 标签数据处理
- Ⅰ. Dicom医学图像处理
- Ⅱ. nii标记数据处理
- Ⅲ. 综合数据处理
- 1. code1
- 2. 需要说明
- 3. code2
Ⅰ. Dicom医学图像处理
reference: https://blog.csdn.net/u011764992/article/details/84501300
dicom 图像就长这样
dicom图像的源数据范围相当大,而转化为图像形式保存的数据则为uint8
类型,直接转化会有损失,本文将其转为.npy
形式。
Ⅱ. nii标记数据处理
reference: https://blog.csdn.net/weixin_43330946/article/details/89576759
这里有以前写的ITK-SNAP使用技巧: https://www.jianshu.com/p/79ac3ce55a93
使用ITK-SNAP对dicom 图像进行标记
同样转化为.npy
格式
Ⅲ. 综合数据处理
1. code1
使用本代码是在dicom数据转化为.npy格式,而.nii的标记数据还未进行转化的情况下
import numpy as np
import os #遍历文件夹
import nibabel as nib #nii格式一般都会用到这个包
import imageio #转换成图像
from matplotlib import pyplot as plt
import cv2def nii_to_image(niifile):filenames = os.listdir(filepath) #读取nii文件夹slice_trans = []for f in filenames:#开始读取nii文件img_path = os.path.join(filepath, f)img = nib.load(img_path) #读取niiimg_fdata = img.get_fdata()fname = f.replace('.nii','') #去掉nii的后缀名#开始转换为图像(x,y,z) = img.shapefor i in range(0,z): silce = img_fdata[:, :, i]slice_trans.append(silce)return slice_transdef get_image_file(file_dir):image_data = []files = os.listdir(file_dir)files.sort(key= lambda x:int(x[:-4]))for file in files:if os.path.splitext(file)[1] == '.npy':img_item = np.load(file_dir + file)image_data.append(img_item)return image_dataif __name__ == '__main__':filepath = './imgData/seg12190000'label = nii_to_image(filepath)file_dir = './Documents/dicom2npy_75989854/'image_data = get_image_file(file_dir)imgfile = './imgData/label/'for i in range(len(image_data)):filename_item = imgfile + str(i + 1)img_item = image_data[i]# 简单对 img 进行处理img_item[img_item < 0] = 0img_item[img_item > 512] = 512# img_item.dtype = np.uint8img_item = img_item.astype(np.uint8)# 不知道为什么只有这样才能整出来label_item = label[149-i]label_item = np.rot90(label_item, -1)label_item = np.flip(label_item, 1)# 图片做成三通道查看一下效果img_item = cv2.merge([img_item, img_item, img_item])img_item[label_item > 0] = img_item[label_item > 0] * 0.6 + (80, 0, 0)# imageio.imwrite(os.path.join(imgfile, '{}.png'.format(i)), img_item)# imageio.imwrite(os.path.join(imgfile, '{}.png'.format(i)), label_item)# 保存调试好的label, 反序 + 左右翻转 + 旋转-1*90np.save(os.path.join(imgfile, '{}.npy'.format(i)), label_item)print(i)
2. 需要说明
不知道为什么,采用上述博客的做法即对提取出的标记数据以silce = img_fdata[:, :, i]
直接进行切片效果对不上。在几番尝试后摸索出了这样的逻辑:
label_item = label[149-i]
label_item = np.rot90(label_item, -1)
label_item = np.flip(label_item, 1)
真是惊呆了,倒序+旋转+左右翻转?
不过总而言之这样就匹配上了
3. code2
针对前面已经提取好的.npy格式的源数据,编写了读入训练数据的类如下:
import os
import numpy as np
import matplotlib.pyplot as plt
import random
import cv2class trainData():def __init__(self):''' 图像数据与标记数据路径 s1: 各为 150张 '''self.image_dir = './imgData/train_data/s1/image/'self.label_dir = './imgData/train_data/s1/label/'self.image_data = Noneself.label_data = Nonedef get_image_file(self):''' 图像数据为 512 * 512, 为源数据值, 未作改动(范围在: -500左右 ~ 1000+ ) '''file_dir = self.image_dirimage_data = []files = os.listdir(file_dir)files.sort(key= lambda x:int(x[:-4]))for file in files:if os.path.splitext(file)[1] == '.npy':img_item = np.load(file_dir + file)image_data.append(img_item)self.image_data = image_datareturn image_datadef get_label_file(self):''' 标签数据为 512 * 512, 为0/1 '''file_dir = self.label_dirlabel_data = []files = os.listdir(file_dir)files.sort(key= lambda x:int(x[:-4]))for file in files:if os.path.splitext(file)[1] == '.npy':img_item = np.load(file_dir + file)label_data.append(img_item)self.label_data = label_datareturn label_datadef test_show(self):''' 随机取九张展示 '''if self.image_data == None or self.label_data == None:self.get_image_file()self.get_label_file()_, figs = plt.subplots(3, 3)for i in range(3):for j in range(3): index = random.randint(0,len(self.image_data)-1)img_item = self.image_data[index]label_item = self.label_data[index]# 标签处简单处理,显示浅红色img_item[img_item < 0] = 0img_item[img_item > 255] = 255img_item = img_item.astype(np.uint8)img_item = cv2.merge([img_item, img_item, img_item])img_item[label_item > 0] = img_item[label_item > 0] * 0.6 + (80, 0, 0)figs[i][j].imshow(img_item)plt.show()def get_train_data(self):''' TODO:先试试使用未经处理的图像数据, 返回对象为包含np矩阵的列表'''self.get_image_file()self.get_label_file()return self.image_data, self.label_dataif __name__ == "__main__":# 处理源图像与标记数据trainDataLoader = trainData()trainDataLoader.test_show()x,y = trainDataLoader.get_train_data()
看看随机展示九张图的效果:
Dicom 医学图像与 nii 标签数据处理相关推荐
- DCMTK:命令行应用程序修改DICOM文件中的标签
DCMTK:命令行应用程序修改DICOM文件中的标签 命令行应用程序修改DICOM文件中的标签 命令行应用程序修改DICOM文件中的标签 #include "dcmtk/config/osc ...
- Dicom批量转nii(医学影像格式转换,SPM)
Dicom批量转nii(医学影像格式转换,SPM) 实验中需要用spm12进行配准,spm12 配准只能导入nii格式,但影像是dicom格式的,需要先进行格式转换. spm12有自带的dicom转n ...
- CT图像分割dicom文件与nii.gz文件预处理----窗宽(window width)和窗位(window level)的设置
最近被CT图像的值弄得很烦,记录一下. CT分割也是个很热门的话题,病灶分割,器官分割等. CT图像大多是两种格式.dcm和nii.gz,当然也有别的,但这里我就不说别的,就说这两种常用的. .dcm ...
- 医学图像NIFTI(.nii)转换为mhd、raw文件格式
文章目录 NIFTI(.nii)文件格式 mhd.raw文件格式 python代码实现 NIFTI(.nii)文件格式 Nifti 格式最初是为神经影像学发明的.神经影像信息学技术计划(NIFTI)将 ...
- 【转】DICOM医学图像读取涉及到的医学坐标体系
转:https://blog.csdn.net/sunyao_123/article/details/78975816 确定患者的位置和躺的方向主要有3个标签: (0018, 5100) Patien ...
- DICOM 医学图像阅读器 CT MRI 超声 医疗软件 三维重建 可视化编程技术及应用
一. 概述 此系统实现了常见 VTK 四视图,实现了很好的 DICOM 图像显示,可用于 DICOM 超声 X线 CT MR 三维重建 拾取像素值 窗宽 窗位 像素,距离测量,角度测量,提供源码: 并 ...
- 使用python进行dicom序列转nii
一.第一步安装环境 pip install dicom2nifti 二.第二步写代码 现在我有一个文件夹里面都是dicom序列需要转换 import dicom2niftiif __name__ == ...
- 【转帖】dicom学习笔记
DICOM是Digital Imaging and Communications in Medicine的英文缩写,即医学数字成像和通信标准.是ACR(American College of Radi ...
- DICOM图像的理解与学习
Dicom文件的详细解析 使用深度学习进行医疗影像分析:文件格式篇 DICOM文件格式剖析(初识) 一.DICOM格式图像 1.DICOM图像显示以及DICOM图像信息显示 我们有一堆DICOM文件 ...
最新文章
- anaconda -spyder报错解决-UnicodeDecodeError: 'gbk' codec can't decode byte 0x93 in position 611: illegal
- PortSentry
- python 发起HTTP请求
- Sql Server 中存储过程的output return的区别
- python进阶之装饰器之3如何利用装饰器强制函数上的类型检查
- stream实现list根据对象中多个属性分组,并取分组后最新数据
- 一些简单的git命令及操作
- 分布式存储中HDFS与Ceph两者的区别是什么,各有什么优势?
- JS调用摄像头屏幕截图
- 快速阅读之眼球的训练
- 盘点常用的IDC综合业务、财务及用户管理平台
- 面向对象的软件开发方法
- 漫画:面试过程的神回复
- 联通一直显示无法连接服务器是怎么回事,联通宽带无法连接服务器1404
- 台式计算机无线网络,台式电脑怎么设置无线网络?
- uni-app小程序 真机显示canvas上利用base64图片生成的海报
- 【我们一起写框架】MVVM的WPF框架(五)—完结篇
- CV(1) : 光 颜色 颜色空间
- 如何在百度地图、腾讯地图标注公司地址信息?
- Python计算机视觉编程第九章——图像分割
热门文章
- 编译期会出现错误提示有哪些_Webpack 5有哪些值得期待
- centos7 开机启动文件路径_centos7定时运行python脚本
- EDLines: A real-time line segment detector with a false detection control
- 残差网络ResNet
- P1068 分数线划定
- 指定范围内的水仙数(C语言)
- 远程连接Ubuntu服务器
- CNN————激活可能性小的神经元不代表这个神经元的用处小
- ODrive踩坑(三)AS5047P磁编码器的ABI接口
- 【Qt教程】2.4 - Qt5 控件 - QListWidget列表框