vtkResliceImageViewer 显示不正确(太暗)的 dicom 图像

vtkResliceImageViewer display incorrect (too dark) dicom image

我正在使用 vtkResliceImageViewer vtk 库 class 来显示 DICOM files。图像太暗。不知道是我用错了还是bug(之前发过类似未解决的问题:Correct display of DICOM images ITK-VTK (images too dark))。

我正在使用自定义 DICOM 数据 reader,我确定数据没问题。 vtkImageViewer2 class 显示正确。我确定这不是与 Modality LUTRescale Slope/InterceptVOI LUTwindow center/width(值很好)相关的问题。

我附上了生成两个图像的基本代码示例。 Window center = 40width = 400 是硬编码的,并且 100% 适合测试图像。使用 vtkImageViewer2 class 渲染带有红色背景的 window 显示图像,它非常好。使用 vtkResliceImageViewer 渲染带有绿色背景显示图像的 window,它太暗了。当我设置 WindowLevel to -40 而不是 40 时,它看起来接近正确显示的图像。

两个类都使用 vtkImageMapToWindowLevelColors 应用 window 转换。我试过使用 class 的 SetOutputFormatToLuminance()PassAlphaToOutputOff() 方法,但这没有帮助。

有人遇到同样的问题并以某种方式解决了吗?

SeriesDataReader dataReader;
vtkSmartPointer<vtkImageData> data = dataReader.ReadSeriesData();

vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetSize(900, 900);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->SetBackground(0, 1, 0);
renderer->ResetCamera();
renderWindow->AddRenderer(renderer);


vtkSmartPointer<vtkRenderWindow> renderWindow2 = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow2->SetSize(900, 900);
vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New();
renderer2->SetBackground(1, 0, 0);
renderer2->ResetCamera();
renderWindow2->AddRenderer(renderer2);

vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor2 = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor2->SetRenderWindow(renderWindow2);
vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputData(data);
imageViewer->SetColorLevel(40.0);
imageViewer->SetColorWindow(400.0);
imageViewer->SetupInteractor(renderWindowInteractor2);
imageViewer->SetRenderWindow(renderWindow2);
imageViewer->SetRenderer(renderer2);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
imageViewer->Render();


vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkResliceImageViewer> resliceImageViewer = vtkSmartPointer<vtkResliceImageViewer>::New();
resliceImageViewer->SetupInteractor(renderWindowInteractor);
resliceImageViewer->SetRenderWindow(renderWindow);
resliceImageViewer->SetSliceOrientationToXY();
resliceImageViewer->SetRenderer(renderer);
resliceImageViewer->SetInputData(data);
resliceImageViewer->SetSliceOrientation(2);
resliceImageViewer->SetResliceModeToAxisAligned();
resliceImageViewer->SetColorLevel(40.0);
resliceImageViewer->SetColorWindow(400.0);
resliceImageViewer->SetResliceMode(0);
resliceImageViewer->GetRenderer()->ResetCamera();
resliceImageViewer->Render();


imageViewer->GetRenderWindow()->Render();
renderWindowInteractor2->Initialize();
imageViewer->GetRenderWindow()->Render();
renderWindowInteractor2->Start();

resliceImageViewer->GetRenderWindow()->Render();
renderWindowInteractor->Initialize();
resliceImageViewer->GetRenderWindow()->Render();
renderWindowInteractor->Start();

我解决了那个问题。为了正确显示带有 wl/ww 转换的图像,注释掉或删除 void vtkResliceImageViewer::InstallPipeline() 函数中的第 327 行。

第 327 行:this->WindowLevel->SetLookupTable(this->GetLookupTable());