dicom文件的处理——pydicom库的使用

2024-03-01 10:04
文章标签 使用 处理 dicom pydicom

本文主要是介绍dicom文件的处理——pydicom库的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 计算两个切片的质量(dicom格式)

import cv2
from pydicom import dcmread
import numpy as np
from skimage.metrics import structural_similarity as compare_ssim
from skimage.metrics import peak_signal_noise_ratio as compare_psnr
from skimage.metrics import mean_squared_error as compare_mse# 读取第一个DICOM文件
d1 = dcmread('PA1/SE0/IM0.IMA')
image_data1 = d1.pixel_array# 读取第二个DICOM文件
d2 = dcmread('PA1/SE1/IM0.IMA')
image_data2 = d2.pixel_array# 将图像转换为8位无符号整型格式
image_data1 = image_data1.astype(np.uint16)
image_data2 = image_data2.astype(np.uint16)# 计算SSIM值
ssim_value = compare_ssim(image_data1, image_data2)
psnr_value = compare_psnr(image_data1,image_data2)
mse_value = compare_mse(image_data1,image_data2)
print(ssim_value, psnr_value, mse_value)

2. 对dicom文件进行重采样

之前的size大小不一,因此需要重采样到同一个size


import pydicom
import numpy as npimport pydicom
from PIL import Image
import os
from matplotlib import pyplot as plt
import lpips
from matplotlib import pyplotdef get_filelist(folder_path):file_names = os.listdir(folder_path)return file_namesdef resample_dicom(ds, out_file, PA, idx):image_data = ds.pixel_array# 设置目标分辨率(这里以2x2作为示例)target_resolution = (512, 512)# 创建PIL图像对象image = Image.fromarray(image_data).resize(target_resolution)# 转换为numpy数组resampled_data = np.asanyarray(image)ds.PixelRepresentation = 1if ds.BitsAllocated == 16:resampled_data = resampled_data.astype(np.uint16, casting="safe")elif ds.BitsAllocated == 8:resampled_data = resampled_data.astype(np.int8, casting="safe")else:raise Exception("unknow Bits Allocated value in dicom header")# 设置新的像素数组ds.PixelData = resampled_data.tobytes()ds.Rows, ds.Columns = resampled_data.shape# 保存为新的DICOM文件# ds.save_as("output_file.dcm")ds.save_as("CTA-GAN1/"+ "PA"+str(PA+1)+"/"+out_file+"/IM"+str(idx)+".IMA")for PA in range(10):SE0_path = "CTA-GAN/PA" + str(PA + 1) + "/SE0"SE1_path = "CTA-GAN/PA" + str(PA + 1) + "/SE1"files_name = get_filelist(SE0_path)for idx in range(len(files_name)):ds1 = pydicom.dcmread(SE0_path+"/IM"+str(idx)+".IMA",  force=True)  # 读取头文件ds2 = pydicom.dcmread(SE1_path+"/IM"+str(idx)+".IMA",  force=True)  # 读取头文件resample_dicom(ds1,"SE0", PA ,idx)resample_dicom(ds2, "SE1", PA, idx)

3. 创建训练、测试的txt,用于加载数据集

import osos.remove('train.txt')
os.remove('val.txt')
os.remove('test.txt')f1 = open("train.txt", "w")  # 564
f2 = open("val.txt", "w")  # 187
f3 = open("test.txt", "w")  # 188def get_filelist(folder_path):file_names = os.listdir(folder_path)return file_namesdef write_txt(path, txt):files_name = get_filelist(path)for i in range(len(files_name)):# aa = "data/" + path + "/" + files_name[i]aa = "data/" + path + "/" + "IM" + str(i) + ".IMA"txt.writelines(aa + "\n")for i in range(8):SE0_path = "CTA-GAN/PA" + str(i + 1) + "/SE0"SE1_path = "CTA-GAN/PA" + str(i + 1) + "/SE1"write_txt(SE0_path, f1)write_txt(SE1_path, f1)SE0_path = "CTA-GAN/PA9/SE0"
SE1_path = "CTA-GAN/PA9/SE1"write_txt(SE0_path, f2)
write_txt(SE1_path, f2)SE0_path = "CTA-GAN/PA10/SE0"
SE1_path = "CTA-GAN/PA10/SE1"write_txt(SE0_path, f3)
write_txt(SE1_path, f3)f1.close()
f1.close()
f2.close()

4. 对dicom进行rename

import osdef count_files(folder):file_count = len([name for name in os.listdir(folder) if os.path.isfile(os.path.join(folder, name))])return file_countdef get_filelist(folder_path):file_names = []for file in os.listdir(folder_path):if not os.path.isdir(os.path.join(folder_path, file)):file_names.append(file)return file_namesdef rename_file(old_file, idx, file_path):# 定义原始文件路径和新文件名# old_file = "path/to/original.txt"old_file = os.path.join(file_path, old_file)new_name = os.path.join(file_path, "IM"+str(idx)+".IMA")try:# 调用rename()函数来重命名文件os.rename(old_file, new_name)print("文件已成功重命名为", new_name)except FileNotFoundError:print("未找到指定的文件")except Exception as e:print("发生错误:", str(e))for i in range(10):SE0_path = "PA"+str(i+1)+"/SE0"SE1_path = "PA"+str(i+1)+"/SE1"num_file = count_files(SE0_path)files_name = get_filelist(SE0_path)for i in range(num_file):rename_file(files_name[i], i, SE0_path)files_name = get_filelist(SE1_path)for i in range(num_file):rename_file(files_name[i], i, SE1_path)

5. 删除文件夹下面的所有文件(只删除文件,不删除文件夹)

#删除文件夹下面的所有文件(只删除文件,不删除文件夹)
import os
import shutildef del_file(path_data):for i in os.listdir(path_data) :# os.listdir(path_data)#返回一个列表,里面是当前目录下面的所有东西的相对路径file_data = path_data + "\\" + i#当前文件夹的下面的所有东西的绝对路径if os.path.isfile(file_data) == True:#os.path.isfile判断是否为文件,如果是文件,就删除.如果是文件夹.递归给del_file.os.remove(file_data)else:del_file(file_data)
path_data = r"CTA-GAN1"
del_file(path_data)

这篇关于dicom文件的处理——pydicom库的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/762066

相关文章

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)