本文主要是介绍Dicom图像方位解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题
任意给定一张Dicom图像或者MPR重建图像,怎么解析这个图像的具体方位呢?
前置
- Dicom图像中通常使用LPS来表示X,Y,Z轴正方向。
- Dicom图像中的tag(0020,0037)表示图像X轴与Y轴在标准LPS坐标系里的方位向量。
解析
对于任意给定的方向向量(x,y,z)
- x>0,表示该方向与L同向;x<0,表示该方向与R同向;
- y>0,表示该方向与P同向;x<0,表示该方向与A同向;
- z>0,表示该方向与S/H同向;x<0,表示该方向与I/F同向;
另外单位向量有x^2 + y^2 + z^2 = 1,
- 解析1个方向,考虑分量的绝对值大于sqrt(1/2.0);
- 解析2个方向,考虑分量的绝对值大于sqrt(1/3.0);
char* ComputeOrientation(std::vector<double> vecs)
{char *orientation = new char[4];char *optr = orientation;*optr = '\0';// RAI(F)char x_desc = vecs[0] < 0 ? 'R' : 'L';char y_desc = vecs[1] < 0 ? 'A' : 'P';char z_desc = vecs[2] < 0 ? 'I' : 'S';double abs_x = fabs(vecs[0]);double abs_y = fabs(vecs[1]);double abs_z = fabs(vecs[2]);// double eps = 0.001 // 3个方向// double eps = 0.577; // 2个方向double eps = 0.707; // 1个方向for (int i = 0; i < 3; ++i){if (abs_x > eps && abs_x > abs_y && abs_x > abs_z){*optr++ = x_desc;abs_x = 0;}else if (abs_y > eps && abs_y > abs_x && abs_y > abs_z){*optr++ = y_desc;abs_y = 0;}else if (abs_z > eps && abs_z > abs_x && abs_z > abs_y){*optr++ = z_desc;abs_z = 0;}else break;*optr = '\0';}return orientation;
}
这篇关于Dicom图像方位解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!