20. DICOM图像层级分类-DCMTK-层级分类

  本篇文章对应的DICOM原理部分,在专栏从零讲解DICOM协议-成像协议的文章DICOM层级关系,建议先了解原理,有助于理清代码思路。
  DICOM有四个从上到下层级关系,分别是Patient(病人),Study(检查),Series(序列),Sop(图像)。
  对杂乱无序的DICOM图像进行分类是一些高级应用的前提,比如阅片,三维重建。阅片要求一个Study的各个Series分开,Series的SOP按扫描顺序排序。三维重建是针对一个Series进行的,切片顺序更是要正确,否则重建后的三维图像会错位。
  Patient可以有多个Study,Study可以有多个Series,Series可以有多个Sop。实际的意义为一个人可以做多次检查,一个检查的图像按照层厚、窗宽窗位、动静脉期等不同可以有不同的序列,一个序列需要多张图像才能完整显示扫描的器官。分类完成后按照层级保存,即顶层目录为PatientID命名->包含StudyInstanceUID命名的检查层级目录->包含SeriesInstanceUID命名的系列层级目录->包含SopInstanceUID命名的图像。
根据DICOM规定的每个层级所属的元素,选取部分重要的元素,构造数据结构。
分类结果示例:
在这里插入图片描述

  1. Patient层级
    包含病人的基本信息,如姓名,性别,年龄等
    patientPath为Patient层级的完整路径
    studyinfoset为一个Patient(病人)做的多次Study(检查)
class PatientInfo
	{
   
	public:
		~PatientInfo(){
   }
	public:
		string patientID;
		string name;
		string sex;

	public:
		string patientBirthDate;
		string patientBirthTime;
		string patientSize;
		string patientWeight;
	public:
		string patientPath;
		vector<StudyInfo*> studyinfoset;
	};

对应dicom图像中的元素
在这里插入图片描述
2. Study层级
  包含检查的基本信息,如studyInstanceUID,studyID,modalitiesInStudy等
  studyPath为Study层级的完整路径
  seriesinfoset为一个Study(检查)中的多个Series(序列)
  其中要注意的是modalitiesInStudy,这个元素属于检查级别。容易和序列级别的Modality弄混。
  序列的Modality是单值,即CT、MR等的一种,检查的modalitiesInStudy是多值,一个Study的多个Series可能有不同的Modality,所以ModalitiesInStudy是复数,VM=1~n,是Series的Modality组合,有多个值。
  Modalities in Study:All of the distinct values used for Modality (0008,0060) in the Series of the Study.

class StudyInfo
	{
   
	public:
		~StudyInfo(){
   }
	public:
		string studyInstanceUID;
		string studyID;
		string accessNumber;
		string modalitiesInStudy;
		string studyDate;
		string studyTime;
	public:
		string referringPhysicianName;
		string studyDescription;
		string bodyPartExamined;
	public:
		string studyPath;
		string callingAet;
		vector<SeriesInfo*> seriesinfoset;
	};

在这里插入图片描述
3. 序列层级
  包含序列的基本信息,如seriesInstanceUID,seriesNumber等
  imageinfoset为一个Series(序列)中的多个SOP(实例)

class SeriesInfo
	{
   
	public:
		~SeriesInfo(){
   }
	public:
		string seriesInstanceUID;
		string seriesNumber;
		string modality;
	public:
		string sliceThickness;
		string windowWidth;
		string windowCenter;
	public:
		string seriesFileNum;

		vector<SOPInfo*> imageinfoset;
	};
  1. 图像层级
    包含图像的基本信息,如sOPInstanceUID,instanceNumber等
class SOPInfo : public ImageInfo
	{
   
	public:
		string sOPInstanceUID;
		string instanceNumber;
	public:
		string sOPClassUID;
		string sliceLocation;
	};

  图像层级的一些同DICOM元素无关的信息较多,所以独立封装为ImageInfo类

class ImageInfo
	{
   
	public:
		string fileName;
		string filePath;
		string classifyFolder;

	};
  1. 封装以上的对象
class Taginfo
	{
   
	public:

		PatientInfo patientinfo;
		StudyInfo studyinfo;
		SeriesInfo seriesinfo;
		SOPInfo sopinfo;
	};
  1. 读取文件夹中的所有文件,进行分类
void classify(string filePath)
{
   
	vector<string> files = Tool().FindFile(filePath);
	ClassifyAdapter *classify = new ClassifyAdapter();

	vector<string>files_;
	for (int i = 0; i < files.size(); i++)
	{
   

		classify->DcmFileClassify(files[i]);
	}

	vector<PatientInfo*> patientInfos = classify->GetClassifyResultFull();
}

6.1 解析每一张DICOM图像

void ClassifyAdapter::DcmFileClassify(string filepath, string basepath, string callingAet)
{
   
	dcmParse = new DcmParse(filepath);

	Taginfo taginfo;
	taginfo.patientinfo = GetPatientInfo();
	taginfo.studyinfo = GetStudyInfo(callingAet);
	taginfo.seriesinfo = GetSeriesInfo()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DICOM医学影像

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值