多帧Dicom文件获取ImagePosition、Intercept、Slope、PixelSpacing
开发环境
VS2022
Win11
Fo-Dicom 5.0.3(当前最新已经更新到了5.1.2)
背景
在做Dicom文件读取时,发现对于多帧Dicom文件的一些Tag的读取总是会出问题(读取不到),但同类软件却是没有问题的,甚是疑惑。
通过多天的摸索,终是找到了解决办法,能顺利读取多帧Dicom中的某帧图片的ImagePosition及整个序列的Intercept、Slope、 PixelSpacing 。
Fo-Dicom读取多帧ImagePosition、Intercept、Slope
获取某帧的 Image Position
下图中的高量为Image Position
ImagePositon标签是计算层间距的关键标签,若直接通过SpaceBetweenSlice读取到的层间距,是不准确的(实际CT中,这个标签的值可能不正确) ;通过ImagePosition标签的获取,然后通过相邻两张图片的位置数据相减,即可计算出层间距。
获取Intercept、Slope
下图中高亮为当前查看病例的Intercept,其下即为Slope。
获取PixlSpacing
下图中高亮为当前查看病例PixlSpacing
获取时如下:
获取示例代码:
private static void GetPixelSpacing(DicomDataset dataset, ref CaseDTO patientCase){if (dataset.TryGetSingleValue<double>(DicomTag.PixelSpacing, out double pixelSpacing)){patientCase.PixelSpacing = pixelSpacing;}else{//多帧Dicom的读取pixelSpacingif (dataset.TryGetSequence(DicomTag.SharedFunctionalGroupsSequence, out DicomSequence sharedFunctionalGroupsSequence)){var seq = GetTagDicomDataset(sharedFunctionalGroupsSequence, DicomTag.PixelMeasuresSequence);if (seq is not null && seq.TryGetSequence(DicomTag.PixelMeasuresSequence, out DicomSequence pixelMeasuresSequence)){var ds = GetTagDicomDataset(pixelMeasuresSequence, DicomTag.PixelSpacing);if (ds is not null && ds.TryGetValues<double>(DicomTag.PixelSpacing, out double[] px)){patientCase.PixelSpacing = px[0];}else{//提示异常}}else{//提示异常}}else{patientCase.PixelSpacing = 0;//最好是直接提示异常}}}private static DicomDataset GetTagDicomDataset(DicomSequence dicomSequence, DicomTag dicomTag){var lists = dicomSequence.Items;foreach (var e in lists){if (e.Contains(dicomTag)){return e;}}return null;}
本文为愚博客园文章。
博客园链接:多帧Dicom文件获取ImagePosition、Intercept、Slope、PixelSpacing - 盛沧海 - 博客园