2016-07-06 111 views
1

我正在使用vtkResliceImageViewer vtk庫類來顯示DICOM files。圖像太暗。我不知道我是否錯誤地使用了它,或者它是一個錯誤(之前發佈了類似的未解決的問題:Correct display of DICOM images ITK-VTK (images too dark))。vtkResliceImageViewer顯示不正確(太暗)dicom圖像

我使用自定義DICOM數據讀取器,我確定數據沒問題。 vtkImageViewer2類正確顯示它。我確定這不是連接到Modality LUTRescale Slope/Intercept,VOI LUTwindow center/width(值是好的)的問題。

我附上生成兩幅圖像的基本代碼示例。 Window center = 40width = 400是硬編碼的,對測試圖像100%正確。用紅色背景渲染窗口使用vtkImageViewer2類顯示圖像,它非常好。使用vtkResliceImageViewer渲染帶綠色背景顯示圖像的窗口,太暗。當我設置WindowLevel to -40而不是40時,它看起來接近正確顯示的圖像。

兩個類都使用vtkImageMapToWindowLevelColors來應用窗口轉換。我試過使用該類的SetOutputFormatToLuminance()PassAlphaToOutputOff()方法,但這並沒有幫助。

有人有同樣的問題,並以某種方式解決嗎?

enter image description here

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(); 
+0

你有沒有嘗試看看,如果顏色的alpha通道過程中,不會丟失? – Destrif

+0

太暗圖像的兩個常見原因是:1)(缺少)伽瑪校正,以及2)阿爾法混合。看看右側的圖像,我會打賭alpha混合:你的阿爾法被設置爲強度,爲淡藍色背景爲零。嘗試禁用alpha混合,如果你可以 – Destrif

+0

對於vtkImageData我設置:AllocateScalars(VTK_DOUBLE,1)。圖像數據由每個像素一個分量的雙倍值組成,因此不存在Alpha通道。相同的數據在vtkImageViewer2中正確顯示。 – Springfield762

回答

1

我解決了這個問題。用wl/ww轉換註釋掉或刪除void vtkResliceImageViewer :: InstallPipeline()函數中的第327行來正確顯示圖像。

327線:this->WindowLevel->SetLookupTable(this->GetLookupTable());