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 LUT
、Rescale Slope/Intercept
、VOI LUT
和 window center/width
(值很好)相关的问题。
我附上了生成两个图像的基本代码示例。 Window center = 40
和 width = 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());
我正在使用 vtkResliceImageViewer vtk 库 class 来显示 DICOM files
。图像太暗。不知道是我用错了还是bug(之前发过类似未解决的问题:Correct display of DICOM images ITK-VTK (images too dark))。
我正在使用自定义 DICOM
数据 reader,我确定数据没问题。 vtkImageViewer2
class 显示正确。我确定这不是与 Modality LUT
、Rescale Slope/Intercept
、VOI LUT
和 window center/width
(值很好)相关的问题。
我附上了生成两个图像的基本代码示例。 Window center = 40
和 width = 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());