我试图接受一个RGB fMRI扫描作为输入和输出相同的扫描,但在灰度部分的颜色部分“烧焦”白色本质上。
每当我尝试修改任何数据元素(如光度解释和每个像素的样本),并使用save_as编写新的dicom文件时,我都无法打开该dicom扫描,而dicom查看器给出的错误是它不是dicom图像。
我的密码在下面。
任何帮助都是感激的。提前谢谢。
import pydicom
from pydicom import dcmread
import numpy as np
#function to turn RGB array to grayscale array
#uses dot product of matrices
def rgb2gray(rgb):
fil = [0.299, 0.587, 0.144]
return np.dot(rgb, fil)
ds = pydicom.dcmread("dicom file")
arr = ds.pixel_array
gray_arr = rgb2gray(arr)
#gray_arr = ds.pixel_array[:,:,0]
#Have to change meta tag information when working with dicom images
ds.PhotometricInterpretation = "MONOCRHOME2"
ds.SamplesPerPixel = 1
ds.BitsAllocated = 16
ds.BitsStored = 16
ds.HighBit = 15
del ds.PlanarConfiguration
ds.is_little_endian = True
ds.fix_meta_info()
ds.PixelData = gray_arr.tobytes()
ds.save_as('fMRI.dcm', write_like_original=False)发布于 2021-12-20 20:53:17
主要问题是您的数组有错误的类型-它是浮点数而不是字节,所以保存到像素数据的是浮点值的字节表示(每个值是4个字节)。另外,您将BitsAllocated设置为16,这意味着您期望每个像素有2个字节,但在计算中您只有一个字节范围,例如,您只需要每个像素8位。
最后,您在PhotometricInterpretation中有一个错误("MONOCRHOME2“而不是"MONOCHROME2")。下面是一个可能的解决方案,它将浮点数数组转换为字节数组:
from pydicom import dcmread
from pydicom.uid import generate_uid
import numpy as np
def rgb2gray(rgb):
fil = [0.299, 0.587, 0.144]
return np.dot(rgb, fil)
ds = pydicom.dcmread("dicom file")
arr = ds.pixel_array
gray_arr = rgb2gray(arr).round().astype(np.uint8)
ds.PhotometricInterpretation = "MONOCHROME2"
ds.SamplesPerPixel = 1
ds.BitsAllocated = 8
ds.BitsStored = 8
ds.HighBit = 7
ds.PixelRepresenation = 0
ds.SOPInstanceUID = uid.generate_uid()
del ds.PlanarConfiguration
ds.is_little_endian = True
ds.fix_meta_info()
ds.PixelData = gray_arr.tobytes()
ds.save_as('fMRI.dcm', write_like_original=False)几个注意事项:
只有当您有一个未压缩的传输语法时才能工作,否则您还必须调整传输语法
PixelRepresentation以显示这些是无符号值SOPInstanceUID,否则原始图像将被PACS查看器H 112中的派生图像覆盖以与DICOM保持一致(例如,如果您想将数据发送到PACS),您可能需要修改更多的标记,比如
https://stackoverflow.com/questions/70427525
复制相似问题