一、简介
放疗的靶区等勾画数据通常会存储为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
将点坐标转化为闭合的掩码,此步骤采用opencv来完。
// pData 为指向某层图像的指针
cv::Mat dstMat(mDim[1], mDim[0], CV_8UC1, pData);
// 绘制轮廓
cv::drawContours(dstMat, smoothContours, 0, cv::Scalar(255, 255, 255), -1);
将绘制的图像保存为jpg,以验证转化是否正确。
验证正确后,将该掩码在DICOM数据上进行显示,结果如下,其中白色的区域为DICOM-RT点转为掩码后的区域。
三、将掩码转化为vtkPolyData
掩码转vtkPolyData
// 提取表面
vtkNew<vtkDiscreteMarchingCubes> discrete;
discrete->SetInputData(maskData);
discrete->GenerateValues(1, 255, 255);
discrete->Update();
// 平滑处理
unsigned int smoothingIterations = 15;
double passBand = 0.001;
double featureAngle = 120.0;
vtkNew<vtkWindowedSincPolyDataFilter> 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过程中,在生成掩码时,按照轴位图像进行掩码的生成,会导致一些错误,需要进一步的优化和完善转化过程。