Ran-莫待无花 2023-07-18 19:49 采纳率: 0%
浏览 70
已结题

ActiViz.Net实现MPR功能

img


通过vtkResliceImageViewer事项MRP功能,得到的XY切面和YZ切面的图像都是反向的,而且XZ切面的图像还是反向加翻转的,这个问题怎么处理?


dicomImageReader = vtkDICOMImageReader.New();
            dicomImageReader.SetDirectoryName(DicPath);
            dicomImageReader.Update();

            resliceImageViewers = new vtkResliceImageViewer[SliceNum];
            for (int i = 0; i < SliceNum; i++)
            {
                resliceImageViewers[i] = vtkResliceImageViewer.New();
                resliceImageViewers[i].SetInputData(dicomImageReader.GetOutput());
                vtkResliceCursorLineRepresentation rep = vtkResliceCursorLineRepresentation.SafeDownCast(resliceImageViewers[i].GetResliceCursorWidget().GetRepresentation());
                for (int k = 0; k < 3; k++)
                {
                    rep.GetResliceCursorActor().GetCenterlineProperty(k).SetRepresentationToWireframe();
                    rep.GetResliceCursorActor().GetCenterlineProperty(k).RenderLinesAsTubesOn();
                    rep.GetResliceCursorActor().GetCenterlineProperty(k).SetLineWidth(2);
                    switch (k)
                    {
                        case 0:
                            ;
                            rep.GetResliceCursorActor().GetCenterlineProperty(k).SetColor(0, 0, 255);
                            break;
                        case 1:
                            rep.GetResliceCursorActor().GetCenterlineProperty(k).SetColor(0, 255, 0);
                            break;
                        case 2:
                            rep.GetResliceCursorActor().GetCenterlineProperty(k).SetColor(255, 0, 0);
                            break;
                    }
                }


                switch (i)
                {
                    case 0:
                        {
                            resliceImageViewers[i].SetRenderWindow(renderWindowControlAxial.RenderWindow);
                            resliceImageViewers[i].SetupInteractor(renderWindowControlAxial.RenderWindow.GetInteractor());
                            rep.GetResliceCursorActor().GetCursorAlgorithm().SetReslicePlaneNormalToZAxis();
                            resliceImageViewers[i].SetSliceOrientationToXY();
                            break;
                        }
                    case 1:
                        {
                            resliceImageViewers[i].SetRenderWindow(renderWindowControlSagittal.RenderWindow);
                            resliceImageViewers[i].SetupInteractor(renderWindowControlSagittal.RenderWindow.GetInteractor());
                            rep.GetResliceCursorActor().GetCursorAlgorithm().SetReslicePlaneNormalToXAxis();
                            resliceImageViewers[i].SetSliceOrientationToYZ();
                            break;
                        }
                    case 2:
                        {
                            resliceImageViewers[i].SetRenderWindow(renderWindowControlCoronal.RenderWindow);
                            resliceImageViewers[i].SetupInteractor(renderWindowControlCoronal.RenderWindow.GetInteractor());
                            rep.GetResliceCursorActor().GetCursorAlgorithm().SetReslicePlaneNormalToYAxis();
                            resliceImageViewers[i].SetSliceOrientationToXZ();
                            break;
                        }
                }


                resliceImageViewers[i].SetResliceModeToAxisAligned();
                resliceImageViewers[i].SetLookupTable(resliceImageViewers[0].GetLookupTable());
                resliceImageViewers[i].SetColorWindow(DefaultWindowLevel[0]);
                resliceImageViewers[i].SetColorLevel(DefaultWindowLevel[1]);
                resliceImageViewers[i].SetThickMode(0);
                resliceImageViewers[i].SetResliceMode(1);
                rep.SetManipulationMode(2);
                resliceImageViewers[i].SetResliceCursor(resliceImageViewers[0].GetResliceCursor());
                //resliceImageViewers[i].GetResliceCursorWidget().SetEnabled(1);
                resliceImageViewers[i].GetResliceCursorWidget().SetManageWindowLevel(0);
                resliceImageViewers[i].SetSlice(resliceImageViewers[i].GetSliceMax() / 2);

                resliceImageViewers[i].GetRenderer().ResetCameraScreenSpace();
                resliceImageViewers[i].Render();
                resliceImageViewers[i].Reset();

            }
  • 写回答

4条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-07-18 19:58
    关注

    该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

    要解决反向和翻转的问题,可以尝试在创建vtkResliceImageViewer对象之后添加以下代码:

    resliceImageViewers[i].SetResliceAxesDirectionCosines(dicomImageReader.GetOutput().GetDirection());
    resliceImageViewers[i].SetResliceAxesOrigin(dicomImageReader.GetOutput().GetOrigin());
    

    这将使用DICOM图像的方向余弦和原点信息来设置切面的方向和位置。这样可以确保切面与图像匹配并且不会出现反向或翻转的情况。

    在你的代码中,可以将上述代码添加到以下位置:

    switch (i)
    {
        case 0:
            {
                resliceImageViewers[i].SetRenderWindow(renderWindowControlAxial.RenderWindow);
                resliceImageViewers[i].SetupInteractor(renderWindowControlAxial.RenderWindow.GetInteractor());
                rep.GetResliceCursorActor().GetCursorAlgorithm().SetReslicePlaneNormalToZAxis();
                resliceImageViewers[i].SetSliceOrientationToXY();
                break;
            }
        case 1:
            {
                resliceImageViewers[i].SetRenderWindow(renderWindowControlSagittal.RenderWindow);
                resliceImageViewers[i].SetupInteractor(renderWindowControlSagittal.RenderWindow.GetInteractor());
                rep.GetResliceCursorActor().GetCursorAlgorithm().SetReslicePlaneNormalToXAxis();
                resliceImageViewers[i].SetSliceOrientationToYZ();
                break;
            }
        case 2:
            {
                resliceImageViewers[i].SetRenderWindow(renderWindowControlCoronal.RenderWindow);
                resliceImageViewers[i].SetupInteractor(renderWindowControlCoronal.RenderWindow.GetInteractor());
                rep.GetResliceCursorActor().GetCursorAlgorithm().SetReslicePlaneNormalToYAxis();
                resliceImageViewers[i].SetSliceOrientationToXZ();
                break;
            }
    }
    
    // 添加以下代码
    resliceImageViewers[i].SetResliceAxesDirectionCosines(dicomImageReader.GetOutput().GetDirection());
    resliceImageViewers[i].SetResliceAxesOrigin(dicomImageReader.GetOutput().GetOrigin());
    

    通过这样设置切面的方向和位置,应该能够解决反向和翻转的问题。


    该回答引用NewBing,仅供参考,不保证完全正确

    根据我从网络上搜索到的信息,ActiViz.Net是一个集成了VTK(可视化工具包)的.NET框架,可以用于在.NET编程语言中使用VTK的强大功能。VTK是一个用于3D图形,数据可视化,数据处理等的面向对象的软件系统。¹


    您的代码看起来是使用了vtkResliceImageViewer类来实现MPR功能,这个类可以根据不同的切面方向来显示DICOM图像。²


    我注意到您的代码中没有设置切面图像的方向属性,这可能导致图像显示不正确。您可以尝试在每个resliceImageViewer对象上调用SetResliceAxesDirectionCosines方法,传入一个包含三个方向余弦向量的数组,来指定切面图像的方向。³


    例如,如果您想让XY切面图像与DICOM图像的方向一致,您可以这样写:

    resliceImageViewers[0].SetResliceAxesDirectionCosines(new double[] { 1, 0, 0, 0, 1, 0, 0, 0, 1 });
    

    如果您想让YZ切面图像与DICOM图像的方向一致,您可以这样写:

    resliceImageViewers[1].SetResliceAxesDirectionCosines(new double[] { 0, 1, 0, 0, 0, -1, -1, 0, 0 });
    

    如果您想让XZ切面图像与DICOM图像的方向一致,您可以这样写:

    resliceImageViewers[2].SetResliceAxesDirectionCosines(new double[] { 1, 0, 0, 0, 0, -1, 0, -1, 0 });
    

    这些方向余弦向量是根据DICOM标准中定义的Image Position和Image Orientation计算得到的。³


    源: 与必应的对话, 2023/7/18
    (1) ActiViz .NET User's Guide Version 9 - Kitware Europe. https://www.kitware.eu/wp-content/uploads/2021/02/ActiViz.NET_9.0_Users_Guide.pdf.
    (2) GitHub - dikubb/Activiz-Demo: MPR Demo using Activiz. https://github.com/dikubb/Activiz-Demo.
    (3) How can i determine the ImagePosition of the reconstructed MPR DICOM image?. https://stackoverflow.com/questions/6846761/how-can-i-determine-the-imageposition-of-the-reconstructed-mpr-dicom-image.
    (4) undefined. http://www.kitware.com/.
    (5) undefined. https://training.kitware.fr/browse.
    (6) undefined. https://www.kitware.eu/service/support.
    (7) undefined. https://www.kitware.com/what-we-offer/#books.
    (8) undefined. http://www.vtk.org/.
    (9) undefined. http://www.slicer.org/.
    (10) undefined. http://www.paraview.org/.

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月24日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题