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 标签数据处理相关推荐

  1. DCMTK:命令行应用程序修改DICOM文件中的标签

    DCMTK:命令行应用程序修改DICOM文件中的标签 命令行应用程序修改DICOM文件中的标签 命令行应用程序修改DICOM文件中的标签 #include "dcmtk/config/osc ...

  2. Dicom批量转nii(医学影像格式转换,SPM)

    Dicom批量转nii(医学影像格式转换,SPM) 实验中需要用spm12进行配准,spm12 配准只能导入nii格式,但影像是dicom格式的,需要先进行格式转换. spm12有自带的dicom转n ...

  3. CT图像分割dicom文件与nii.gz文件预处理----窗宽(window width)和窗位(window level)的设置

    最近被CT图像的值弄得很烦,记录一下. CT分割也是个很热门的话题,病灶分割,器官分割等. CT图像大多是两种格式.dcm和nii.gz,当然也有别的,但这里我就不说别的,就说这两种常用的. .dcm ...

  4. 医学图像NIFTI(.nii)转换为mhd、raw文件格式

    文章目录 NIFTI(.nii)文件格式 mhd.raw文件格式 python代码实现 NIFTI(.nii)文件格式 Nifti 格式最初是为神经影像学发明的.神经影像信息学技术计划(NIFTI)将 ...

  5. 【转】DICOM医学图像读取涉及到的医学坐标体系

    转:https://blog.csdn.net/sunyao_123/article/details/78975816 确定患者的位置和躺的方向主要有3个标签: (0018, 5100) Patien ...

  6. DICOM 医学图像阅读器 CT MRI 超声 医疗软件 三维重建 可视化编程技术及应用

    一. 概述 此系统实现了常见 VTK 四视图,实现了很好的 DICOM 图像显示,可用于 DICOM 超声 X线 CT MR 三维重建 拾取像素值 窗宽 窗位 像素,距离测量,角度测量,提供源码: 并 ...

  7. 使用python进行dicom序列转nii

    一.第一步安装环境 pip install dicom2nifti 二.第二步写代码 现在我有一个文件夹里面都是dicom序列需要转换 import dicom2niftiif __name__ == ...

  8. 【转帖】dicom学习笔记

    DICOM是Digital Imaging and Communications in Medicine的英文缩写,即医学数字成像和通信标准.是ACR(American College of Radi ...

  9. DICOM图像的理解与学习

    Dicom文件的详细解析 使用深度学习进行医疗影像分析:文件格式篇 DICOM文件格式剖析(初识) 一.DICOM格式图像 1.DICOM图像显示以及DICOM图像信息显示 我们有一堆DICOM文件 ...

最新文章

  1. anaconda -spyder报错解决-UnicodeDecodeError: 'gbk' codec can't decode byte 0x93 in position 611: illegal
  2. PortSentry
  3. python 发起HTTP请求
  4. Sql Server 中存储过程的output return的区别
  5. python进阶之装饰器之3如何利用装饰器强制函数上的类型检查
  6. stream实现list根据对象中多个属性分组,并取分组后最新数据
  7. 一些简单的git命令及操作
  8. 分布式存储中HDFS与Ceph两者的区别是什么,各有什么优势?
  9. JS调用摄像头屏幕截图
  10. 快速阅读之眼球的训练
  11. 盘点常用的IDC综合业务、财务及用户管理平台
  12. 面向对象的软件开发方法
  13. 漫画:面试过程的神回复
  14. 联通一直显示无法连接服务器是怎么回事,联通宽带无法连接服务器1404
  15. 台式计算机无线网络,台式电脑怎么设置无线网络?
  16. uni-app小程序 真机显示canvas上利用base64图片生成的海报
  17. 【我们一起写框架】MVVM的WPF框架(五)—完结篇
  18. CV(1) : 光 颜色 颜色空间
  19. 如何在百度地图、腾讯地图标注公司地址信息?
  20. Python计算机视觉编程第九章——图像分割

热门文章

  1. 编译期会出现错误提示有哪些_Webpack 5有哪些值得期待
  2. centos7 开机启动文件路径_centos7定时运行python脚本
  3. EDLines: A real-time line segment detector with a false detection control
  4. 残差网络ResNet
  5. P1068 分数线划定
  6. 指定范围内的水仙数(C语言)
  7. 远程连接Ubuntu服务器
  8. CNN————激活可能性小的神经元不代表这个神经元的用处小
  9. ODrive踩坑(三)AS5047P磁编码器的ABI接口
  10. 【Qt教程】2.4 - Qt5 控件 - QListWidget列表框