Ran-莫待无花 2023-05-15 11:10 采纳率: 0%
浏览 135
已结题

vtk勾画rtstruct坐标轮廓

使用fo-dicom读取rtstruct文件,拿到roi的轮廓坐标之后再勾画到原始图像上面的时候方向和原始图像的方向是相反的,这个问题怎么处理?

img

代码如下:

void SetRoiContour()
        {
            foreach (vtkActor contourActor in ContourActors)
            {
                imageViewer2.GetRenderer().RemoveViewProp(contourActor);
            }
            ContourActors = new List<vtkActor>();
            string SopUId = dicomDataset.GetStringValue(DicomTag.SOPInstanceUID);
            int rows = dicomImageReader.GetHeight();
            float[] imagePositionPatient = dicomImageReader.GetImagePositionPatient();
            double[] spacing = dicomImageReader.GetDataSpacing();
            foreach (RoiSequence roiSequence in RoiSequences)
            {
                if (roiSequence == null || roiSequence.RoiColor == null || roiSequence.roiContourDatas == null) continue;
                List<RoiContourData> roiContourData = roiSequence.roiContourDatas.FindAll(p => p.RefeRenceSopUId == SopUId);
                if (roiContourData == null) continue;
                foreach (RoiContourData roiContour in roiContourData)
                {
                    if (roiContour.ContourData == null) continue;
                    // 创建一个空的vtkPoints对象,用于存储轮廓的顶点坐标
                    var contourPoints = vtkPoints.New();
                    // 创建一个空的vtkCellArray对象,用于存储轮廓的多边形拓扑信息
                    var contourCells = vtkCellArray.New();
                    // 创建一个vtkPolyLine对象,用于表示轮廓的多边形线段
                    var polyLine = new vtkPolyLine();
                    // 获取轮廓点数
                    var contourPointsNumber = roiContour.ContourData.Length / 3;
                    // 设置polyLine的点数为numberOfContourPoints
                    polyLine.GetPointIds().SetNumberOfIds(contourPointsNumber);
                    // 将轮廓坐标添加到vtkPoints对象中,并记录其索引
                    var contourPointIds = new List<int>();
                    for (int i = 0; i < roiContour.ContourData.Length; i += 3)
                    {
                        
                        double[] doubles = new double[3];
                        doubles[0] = (roiContour.ContourData[i] - imagePositionPatient[0]);
                        doubles[1] = (roiContour.ContourData[i + 1] - imagePositionPatient[1]);
                        doubles[2] = 1;


                        int contourPointId = (int)contourPoints.InsertNextPoint(doubles[0], doubles[1], doubles[2]);
                        contourPointIds.Add(contourPointId);
                    }
                    // 根据轮廓点数创建一个对应的vtkPolyLine对象,并设置其顶点索引
                    for (int i = 0; i < contourPointsNumber; i++)
                    {
                        polyLine.GetPointIds().SetId(i, contourPointIds[i]);
                    }
                    // 将轮廓多边形添加到vtkCellArray对象中
                    contourCells.InsertNextCell(polyLine);
                    

                    // 创建一个vtkPolyData对象,用于存储轮廓的顶点和多边形
                    vtkPolyData contourPolydata = vtkPolyData.New();
                    contourPolydata.SetPoints(contourPoints);
                    contourPolydata.SetLines(contourCells);
                    // 创建一个vtkPolyDataMapper对象,用于映射轮廓的几何数据到图形基元上
                    var contourMapper = vtkPolyDataMapper.New();
                    contourMapper.SetInputData(contourPolydata);
                    // 创建一个vtkActor对象,用于显示轮廓的颜色和透明度
                    var contourActor = vtkActor.New();
                    contourActor.SetMapper(contourMapper);
                    contourActor.GetProperty().SetColor(roiSequence.RoiColor[0], roiSequence.RoiColor[1], roiSequence.RoiColor[2]);
                    contourActor.GetProperty().SetOpacity(0.5);
                    ContourActors.Add(contourActor);
                }
            }
            foreach (var contourActor in ContourActors)
            {
                imageViewer2.GetRenderer().AddActor(contourActor);
            }

        }

  • 写回答

3条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-15 15:24
    关注
    • 以下回答由chatgpt基于相关博客总结生成:

      对于原问题,可以通过调整绘制轮廓的顺序来解决方向相反的问题。具体步骤如下:

      1. 获取轮廓坐标后,按顺序将坐标点分别存储在两个列表中,分别为x_points和y_points。

      2. 对y_points列表中的坐标进行倒序操作,即将y_points列表反转,可以使用Python内置函数reverse()进行操作。

      3. 将x_points和y_points列表中的坐标顺序重新组合,并将其作为参数传递给绘制轮廓的函数进行绘制。

      具体代码如下:

      # 原始代码获取的轮廓坐标
      x_points = [100, 120, 140, 160, 180, 200, 220, 240, 260]
      y_points = [50, 70, 90, 110, 130, 150, 170, 190, 210]
      
      # 对y_points进行反转操作
      y_points.reverse()
      
      # 组合x_points和y_points
      points = []
      for i in range(len(x_points)):
          points.append((x_points[i], y_points[i]))
      
      # 调用绘制轮廓的函数,并传入重新组合后的点坐标
      draw_contour(points)
      

      另外,使用3D Slicer将实验结果转换为DICOM-RT的过程可以参考上述提供的参考资料,按照步骤操作即可。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月15日
  • 赞助了问题酬金15元 5月15日
  • 创建了问题 5月15日