了解 DICOM 图像属性以获得 axial/coronal/sagittal 削减
Understanding DICOM image attributes to get axial/coronal/sagittal cuts
我必须用 c# 编写一个能够解析 DICOM 并显示轴向、冠状和矢状切面的程序。
看起来工作量很大,但我必须这样做!
我想第一步应该是理解 DICOM 文件。
我一直在阅读本教程http://dicomiseasy.blogspot.ru/,但他正在使用我不允许购买的 RZDCX 库。
关于 DICOM 属性仍然有一些很好的解释,我也一直在阅读标准的某些部分(首先是第 3 部分)
但我很难理解它们。有那些图像属性:像素表示、像素数据、平面配置......我想理解它们对于能够显示图像非常重要,我认为我应该更多地了解像素的实际工作方式以便更好地理解.
但是还有一件事我真的想不通:
我应该如何或在哪里进行这三种不同的切割? (axial/coronal/sagittal)。我一直在标准中寻找关于它们的属性,但没有找到。所以我们可能会通过某种计算找到它们,但我不知道我应该使用哪个公式使用哪些变量?
你说得对,这是一项艰巨的任务!你可能不会在这里找到可以为你提供 step-by-step 教程的人,但是一些提示:
- DICOM 标准有时显得令人望而生畏,一开始需要经历陡峭的学习曲线。 DICOM Cookbook 帮助我熟悉文档的术语和结构。
- 周围还有很多其他工具包,其中一些是免费的,并且附带非常自由的许可证,例如 DCMTK。这些消除了学习信息如何以略有不同的各种二进制格式编码的负担,并提供统一的 API 来非常容易地访问信息。我强烈建议不要从头开始编写自己的 DICOM 实现。
- 定义切片或帧的 3D 位置和方向的 DICOM 属性是
ImagePositionPatient
(0020,0032)、ImageOrientationPatient
(0020,0037) 和 PixelSpacing
(0028 ,0030).这些可用于正确排序切片并计算插值相交切片。
- 确保查看增强的 CT/MR 信息对象定义。通常有两种方法可以在 DICOM 中存储一堆图像:单帧(每个图像一个文件)和多帧(一个文件用于一个或多个图像堆栈)。它们的不同之处在于您获取上述信息的方式。
祝你好运!
有时您必须构建不同的视图。例如,如果您有一个 CT 图像集,该图像集与受试者是轴向的,那么您可以通过适当地对图像集进行采样来制作自己的冠状和矢状视图切片。我将从编写代码开始,以简单地显示您拥有的数据作为起点。到它起作用时,您会对这些问题有更深入的了解。
这是一个 python 实现,用于查找 IMA 文件的平面。
参考:
http://dicomiseasy.blogspot.com/2013/06/getting-oriented-using-image-plane.html
import pydicom # for gettind information out of the IMA files
import numpy as np
"""
This function takes IOP of an image and returns its plane (Sagittal, Coronal, Transverse)
"""
def file_plane(IOP):
IOP_round = [round(x) for x in IOP]
plane = np.cross(IOP_round[0:3], IOP_round[3:6])
plane = [abs(x) for x in plane]
if plane[0] == 1:
return "Sagittal"
elif plane[1] == 1:
return "Coronal"
elif plane[2] == 1:
return "Transverse"
a=pydicom.read_file("path\to\your\DICOM\file.IMA")
IOP = a.ImageOrientationPatient
plane = file_plane(IOP)
这个问题已经是第 3 个 y.o,但也许我的回答会对某些人有所帮助。
@user6867490 已经提到了 Roni Zaharia 的美丽article。
我唯一想补充的是:
您可以通过编写
来简单地访问图像方向(患者),标签(0020,0037)
f = dicom.read_file(dicom_file_name)
f.ImageOrientationPatient
如果你将获得:
['1', '0', '0', '0', '0', '-1'] 你正在处理冠状面 平面图
['0', '1', '0', '0', '0', '-1'] 你正在处理矢状面 平面视图
['1', '0', '0', '0', '1', '0']你处理的是轴向平面视图
在我的案例中,有一个数据集包含一些矢状图和许多轴视图(我实际上需要)。所以,我只是简单地遍历了整个数据集,并做了一个简单的逻辑比较来过滤掉所有的矢状面。
我必须用 c# 编写一个能够解析 DICOM 并显示轴向、冠状和矢状切面的程序。
看起来工作量很大,但我必须这样做!
我想第一步应该是理解 DICOM 文件。
我一直在阅读本教程http://dicomiseasy.blogspot.ru/,但他正在使用我不允许购买的 RZDCX 库。
关于 DICOM 属性仍然有一些很好的解释,我也一直在阅读标准的某些部分(首先是第 3 部分)
但我很难理解它们。有那些图像属性:像素表示、像素数据、平面配置......我想理解它们对于能够显示图像非常重要,我认为我应该更多地了解像素的实际工作方式以便更好地理解.
但是还有一件事我真的想不通:
我应该如何或在哪里进行这三种不同的切割? (axial/coronal/sagittal)。我一直在标准中寻找关于它们的属性,但没有找到。所以我们可能会通过某种计算找到它们,但我不知道我应该使用哪个公式使用哪些变量?
你说得对,这是一项艰巨的任务!你可能不会在这里找到可以为你提供 step-by-step 教程的人,但是一些提示:
- DICOM 标准有时显得令人望而生畏,一开始需要经历陡峭的学习曲线。 DICOM Cookbook 帮助我熟悉文档的术语和结构。
- 周围还有很多其他工具包,其中一些是免费的,并且附带非常自由的许可证,例如 DCMTK。这些消除了学习信息如何以略有不同的各种二进制格式编码的负担,并提供统一的 API 来非常容易地访问信息。我强烈建议不要从头开始编写自己的 DICOM 实现。
- 定义切片或帧的 3D 位置和方向的 DICOM 属性是
ImagePositionPatient
(0020,0032)、ImageOrientationPatient
(0020,0037) 和PixelSpacing
(0028 ,0030).这些可用于正确排序切片并计算插值相交切片。 - 确保查看增强的 CT/MR 信息对象定义。通常有两种方法可以在 DICOM 中存储一堆图像:单帧(每个图像一个文件)和多帧(一个文件用于一个或多个图像堆栈)。它们的不同之处在于您获取上述信息的方式。
祝你好运!
有时您必须构建不同的视图。例如,如果您有一个 CT 图像集,该图像集与受试者是轴向的,那么您可以通过适当地对图像集进行采样来制作自己的冠状和矢状视图切片。我将从编写代码开始,以简单地显示您拥有的数据作为起点。到它起作用时,您会对这些问题有更深入的了解。
这是一个 python 实现,用于查找 IMA 文件的平面。 参考: http://dicomiseasy.blogspot.com/2013/06/getting-oriented-using-image-plane.html
import pydicom # for gettind information out of the IMA files
import numpy as np
"""
This function takes IOP of an image and returns its plane (Sagittal, Coronal, Transverse)
"""
def file_plane(IOP):
IOP_round = [round(x) for x in IOP]
plane = np.cross(IOP_round[0:3], IOP_round[3:6])
plane = [abs(x) for x in plane]
if plane[0] == 1:
return "Sagittal"
elif plane[1] == 1:
return "Coronal"
elif plane[2] == 1:
return "Transverse"
a=pydicom.read_file("path\to\your\DICOM\file.IMA")
IOP = a.ImageOrientationPatient
plane = file_plane(IOP)
这个问题已经是第 3 个 y.o,但也许我的回答会对某些人有所帮助。
@user6867490 已经提到了 Roni Zaharia 的美丽article。
我唯一想补充的是: 您可以通过编写
来简单地访问图像方向(患者),标签(0020,0037)f = dicom.read_file(dicom_file_name)
f.ImageOrientationPatient
如果你将获得:
['1', '0', '0', '0', '0', '-1'] 你正在处理冠状面 平面图
['0', '1', '0', '0', '0', '-1'] 你正在处理矢状面 平面视图
['1', '0', '0', '0', '1', '0']你处理的是轴向平面视图
在我的案例中,有一个数据集包含一些矢状图和许多轴视图(我实际上需要)。所以,我只是简单地遍历了整个数据集,并做了一个简单的逻辑比较来过滤掉所有的矢状面。