VTK: 转化DICOM ST 数据为vtkPolyData显示

一、简介

        放疗的靶区等勾画数据通常会存储为DICOM-RT文件,该文件通常存储勾画点坐标数据。新的需要中DICOM-RT中存储了一个固定模版,需要进行3D打印,因此需要对其格式进行转化,以便进行三维渲染、编辑、保存和打印功能。

       处理流程:读取DICOM-RT文件中的坐标信息(设备),将坐标转化为图象坐标系下,根据每层坐标,构建闭合曲线,填充获得一张数据(和原始DICOM数据同大小,数据类型为unsigned char的vtkImageData),依次完成对所有层的操作,最后将三维数据转化为vtkPolyData。

二、坐标转化并生成vtkImageData,验证其正确性

        坐标转换:读取DICOM文件中的[ (0020,0032), DS, Image Position(Patient) ],对从小到大排序;读取DICOM-RT文件中的所有坐标信息,将其通过平移变换到图像空间。坐标变换到图象空间为: X Y Z

VTK: 转化DICOM ST 数据为vtkPolyData显示_第1张图片

         将点坐标转化为闭合的掩码,此步骤采用opencv来完。

// pData 为指向某层图像的指针
cv::Mat dstMat(mDim[1], mDim[0], CV_8UC1, pData);
// 绘制轮廓
cv::drawContours(dstMat, smoothContours, 0, cv::Scalar(255, 255, 255), -1);

        将绘制的图像保存为jpg,以验证转化是否正确。

 

VTK: 转化DICOM ST 数据为vtkPolyData显示_第2张图片

         验证正确后,将该掩码在DICOM数据上进行显示,结果如下,其中白色的区域为DICOM-RT点转为掩码后的区域。

 三、将掩码转化为vtkPolyData

        掩码转vtkPolyData

    // 提取表面
	vtkNew discrete;
	discrete->SetInputData(maskData);
	discrete->GenerateValues(1, 255, 255);
	discrete->Update();

	// 平滑处理
	unsigned int smoothingIterations = 15;
	double passBand = 0.001;
	double featureAngle = 120.0;

	vtkNew smoother;
	smoother->SetInputConnection(discrete->GetOutputPort());
	smoother->SetNumberOfIterations(smoothingIterations);  // 迭代次数
	smoother->BoundarySmoothingOff();
	smoother->FeatureEdgeSmoothingOff();
	smoother->SetFeatureAngle(featureAngle);
	smoother->SetPassBand(passBand);  // 值越小越光滑
	smoother->NonManifoldSmoothingOn();
	smoother->NormalizeCoordinatesOn();
	smoother->Update();

        转化完成后,进行三维渲染。

 四、总结

       DICOM-RT转化为vtkPolyData过程中,在生成掩码时,按照轴位图像进行掩码的生成,会导致一些错误,需要进一步的优化和完善转化过程。

你可能感兴趣的:(VTK,c++,visual,studio,算法)