dicom图像中冠状位,矢状位和横断位的计算

{//*~get info from file~*//
 // (0028,0030)  像素间距
 float[] pixel_space = new float[2];
 string[] pixel_space_p = Viewer.CurrentImage.DataSet[0x0028, 0x0030].Value as string[];
 pixel_space[0] = float.Parse(pixel_space_p[0]); //Pixel size (row to row) 
 pixel_space[1] = float.Parse(pixel_space_p[1]); //Pixel size (collom to collom)

 // (0028,0010) & (0028,0011)  像素行/列数
 ushort rows = (ushort)(Viewer.CurrentImage.DataSet[0x0028, 0x0010].Value);      // number of rows
 ushort colums = (ushort)(Viewer.CurrentImage.DataSet[0x0028, 0x0011].Value);    // number of colloms

 // (0020,0032)  首像素位置    
 double[] top_left_corner = new double[3];
 string[] top_left_corner_p = Viewer.CurrentImage.DataSet[0x0020, 0x0032].Value as string[];
 top_left_corner[0] = double.Parse(top_left_corner_p[0]);            // X  pos of frame (Top left) in real space   
 top_left_corner[1] = double.Parse(top_left_corner_p[1]);            // Y
 top_left_corner[2] = double.Parse(top_left_corner_p[2]);            // Z

 // (0020,0037)  方向
 double[,] frame_vec = new double[3, 3];
 string[] frame_vec_p = Viewer.CurrentImage.DataSet[0x0020, 0x0037].Value as string[];
 frame_vec[0, 0] = double.Parse(frame_vec_p[0]);                     //top edge frame vector x1
 frame_vec[0, 1] = double.Parse(frame_vec_p[1]);                     //top edge frame vector y1
 frame_vec[0, 2] = double.Parse(frame_vec_p[2]);                     //top edge frame vector z1
 frame_vec[1, 0] = double.Parse(frame_vec_p[3]);                     //left edge frame vector x1
 frame_vec[1, 1] = double.Parse(frame_vec_p[4]);                     //left edge frame vector y1
 frame_vec[1, 2] = double.Parse(frame_vec_p[5]);                     //left edge frame vector z1

 //  calculate the frame Normal ,即求平面法向量
 //  the frame normal lets us know if the image is Sag(矢状位,侧视), Tran(横断位,俯视) or Coronal(冠状位,正视)
 frame_vec[2, 0] = frame_vec[0, 1] * frame_vec[1, 2] - frame_vec[0, 2] * frame_vec[1, 1];
 frame_vec[2, 1] = frame_vec[0, 2] * frame_vec[1, 0] - frame_vec[0, 0] * frame_vec[1, 2];
 frame_vec[2, 2] = frame_vec[0, 0] * frame_vec[1, 1] - frame_vec[0, 1] * frame_vec[1, 0];
           
 //  calculat mid frame distance  求中心位置
 double[] mid_frame = new double[3];
 mid_frame[0] = top_left_corner[0] + (colums / 2) * pixel_space[0] * frame_vec[0, 0] 
                                   + (rows / 2) * pixel_space[1] * frame_vec[1, 0];
 mid_frame[1] = top_left_corner[1] + (colums / 2) * pixel_space[0] * frame_vec[0, 1] 
                                   + (rows / 2) * pixel_space[1] * frame_vec[1, 1];
 mid_frame[2] = top_left_corner[2] + (colums / 2) * pixel_space[0] * frame_vec[0, 2] 
                                   + (rows / 2) * pixel_space[1] * frame_vec[1, 2];

 // if Sagittal check
 if ((Math.Abs(frame_vec[2,0]) > Math.Abs(frame_vec[2,1])) 
     && (Math.Abs(frame_vec[2,0]) > Math.Abs(frame_vec[2,2])))
 {   
    if (Math.Abs(frame_vec[2, 0]) < 0.99)
       MessageBox.Show("Sagittal (" + Convert.ToString(mid_frame[0]) + ")");
    else
       MessageBox.Show("Sagittal " + Convert.ToString(mid_frame[0]));
 }
 else //Cor check
 if ((Math.Abs(frame_vec[2, 1])  > Math.Abs(frame_vec[2, 0])) 
      && (Math.Abs(frame_vec[2, 1]) > Math.Abs(frame_vec[2, 2]))) 
 {
    if (Math.Abs(frame_vec[2, 1]) < 0.99)
       MessageBox.Show("Coronal (" + Convert.ToString(mid_frame[1]) + ")");
    else
       MessageBox.Show("Coronal " + Convert.ToString(mid_frame[1]));
 }
 else // Ax 
 {  if (Math.Abs(frame_vec[2, 2]) < 0.99)
       MessageBox.Show("Transverse (" + Convert.ToString(mid_frame[1]) + ")");
    else
       MessageBox.Show("Transverse " + Convert.ToString(mid_frame[1]));
 }
}



  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值