首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试输入一个RGB fMRI DICOM映像,修改它,并使用pydicom将它保存为一个灰度字典图像。

尝试输入一个RGB fMRI DICOM映像,修改它,并使用pydicom将它保存为一个灰度字典图像。
EN

Stack Overflow用户
提问于 2021-12-20 20:17:41
回答 1查看 417关注 0票数 1

我试图接受一个RGB fMRI扫描作为输入和输出相同的扫描,但在灰度部分的颜色部分“烧焦”白色本质上。

每当我尝试修改任何数据元素(如光度解释和每个像素的样本),并使用save_as编写新的dicom文件时,我都无法打开该dicom扫描,而dicom查看器给出的错误是它不是dicom图像。

我的密码在下面。

任何帮助都是感激的。提前谢谢。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-20 20:53:17

主要问题是您的数组有错误的类型-它是浮点数而不是字节,所以保存到像素数据的是浮点值的字节表示(每个值是4个字节)。另外,您将BitsAllocated设置为16,这意味着您期望每个像素有2个字节,但在计算中您只有一个字节范围,例如,您只需要每个像素8位。

最后,您在PhotometricInterpretation中有一个错误("MONOCRHOME2“而不是"MONOCHROME2")。下面是一个可能的解决方案,它将浮点数数组转换为字节数组:

代码语言:javascript
复制
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)

几个注意事项:

只有当您有一个未压缩的传输语法时才能工作,否则您还必须调整传输语法

  • I added PixelRepresentation以显示这些是无符号值
  • I aso添加了一个新的SOPInstanceUID,否则原始图像将被PACS查看器

H 112中的派生图像覆盖以与DICOM保持一致(例如,如果您想将数据发送到PACS),您可能需要修改更多的标记,比如

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70427525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档