Dicom修改图像内容重新生成dcm文件

Dicom修改图像内容重新生成dcm文件,第1张

用pydicom读取一张dicom医学文件,根据骨头的像素阈值分离出骨头(参考mimics软件中的阈值),然后更改像素值重新生成dcm文件保存。


注:软件中的阈值单位为Hu即CT值(范围为-1024~3071),而Python中读取的是像素值(范围为0~4095),因此需要进行换算:

Hu = pixel * slope + intercept

slope可以通过dcm.RescaleSlope读出(0028|1052),intercept也可以通过dcm.RescaleIntercept读出(0028|1053)


修改图像数据的完整代码如下:

import pydicom
import numpy as np
import os
from pydicom.uid import ExplicitVRLittleEndian
np.set_printoptions(threshold=np.inf)       #打印完整数组
dcm = pydicom.dcmread('.\\001.dcm')  # 读取dicom文件
slope = dcm.RescaleSlope            #1
intercept = dcm.RescaleIntercept  # 可以从dcm文件中读出 -1024
databyte = dcm.PixelData    # 获得图像的byte数据,可直接读写
print(dcm.file_meta.TransferSyntaxUID)        #1.2.840.10008.1.2.4.70
print("dcm的databyte的长度:",len(databyte))     #272492
#直接从dcm读出的像素矩阵
img_arr = dcm.pixel_array   # 获得图像数据的矩阵形式,只读
for i in range(img_arr.shape[0]):
    for j in range(img_arr.shape[1]):
        #提取骨头
        # Hu = pixel * slope + intercept。


密质骨在CT值的范围为(662,1988) 转为像素值后范围为(1686,3012) if img_arr[i][j] >= (662-intercept)/slope and img_arr[i][j] <= (1988-intercept)/slope: img_arr[i][j] = 4095 else: img_arr[i][j] = 0 img_arr16 = np.int16(img_arr) #print("改了之后img_arr16:",img_arr16) data_changed = np.array(img_arr,dtype = np.int16) #print(img_arr.shape) #(512,512) #print("image_array:") #print(img_arr) #dcm.pixel_array.data = data16.data # 第一种修改图像数据的方法,直接修改像素值 pd = data_changed.tobytes() print(len(pd)) #524288 dcm.PixelData = pd # 第二种修改图像数据的方法,修改byte值,建议用这种方式 #dcm.Rows, dcm.Columns = data_changed.shape #print(dcm.Rows,dcm.Columns) new_name = "002.dcm" #原始图像的像素数据进行了压缩,新图像像素数据不压缩。


不加上这一句会出现像素数据长度相关的报错 dcm.file_meta.TransferSyntaxUID = ExplicitVRLittleEndian dcm.save_as(new_name) # dcm2 = pydicom.dcmread('.\\002.dcm') # img_arr2 = dcm2.pixel_array # print("img_arr2:",img_arr2)

img_arr:

img_arr2:

 

得到的002.dcm:

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/589828.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-13
下一篇 2022-04-13

发表评论

登录后才能评论

评论列表(0条)

保存