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

用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:

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值