<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>Hello vtk users,<br></div>
<div> </div>
<div>Have run into a problem/puzzle with regards to the Window/Level adjustment settings in vtkResliceImageViewer.<br></div>
<div>[It's a very useful class, btw, so thanks to it's developers.]<br></div>
<div> </div>
<div>I've attached 2 example images that illustrate the issue. PET as the effect is most dramatic ;-)<br></div>
<div>The same issue occurs for other modalities: MR and CT.<br></div>
<div> </div>
<div>The code [relevant fragment is below] reads the DICOM data and displays it as expected [re PT_before.jpg].<br></div>
<div> </div>
<div>However, when the left mouse button is pressed and the icon is moved, rather then the expected minor change<br></div>
<div>in the Window/Level settings, there is a very large change [re PT_after.jpg].<br></div>
<div> </div>
<div>So, <br></div>
<div> </div>
<div>Is there something missing or wrong from the code below?<br></div>
<div> </div>
<div>Is the Window/Level change functionality missing from vtkResliceImageViewer?<br></div>
<div> </div>
<div>Is there a callback that I need to add? If so, is there a sample code fragment somewhere?<br></div>
<div> </div>
<div>Any insight would be appreciated.<br></div>
<div> </div>
<div>Audrius<br></div>
<div> </div>
<div> </div>
<div>OS: Windows 7 x64<br></div>
<div>vtk: 5.10.1<br></div>
<div>compiler: VS 2008 version 9 [x64]<br></div>
<div> </div>
<div>Code fragment:<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>vtkSmartPointer<vtkGDCMImageReader> imageReader = vtkSmartPointer<vtkGDCMImageReader>::New();<br></div>
<div> </div>
<div>// . . . gets the DICOM data here<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>// Scalar image data display<br></div>
<div><span class="Apple-tab-span"></span>vtkSmartPointer<vtkResliceImageViewer> resliceImageViewer = vtkSmartPointer<vtkResliceImageViewer>::New();<br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer->SetInput( imageReader->GetOutput()); //<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>std::string dicomModality = imageReader->GetMedicalImageProperties()->GetModality();<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>if( dicomModality == "PT" ||<br></div>
<div><span class="Apple-tab-span"></span> dicomModality == "NM" || <br></div>
<div><span class="Apple-tab-span"></span> dicomModality == "ST" ) <br></div>
<div><span class="Apple-tab-span"></span>{<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> std::cout << "DICOM modality: " << dicomModality << std::endl;<br></div>
<div class="dir-ltr" dir="ltr"> </div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> double window;<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> double level; <br></div>
<div class="dir-ltr" dir="ltr"> </div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> imageReader->GetMedicalImageProperties()->GetNthWindowLevelPreset <span class="size" style="font-size:13px">( 0</span><span class="size" style="font-size:13px">, &window</span><span class="size" style="font-size:13px">, &level );</span><br></div>
<div class="dir-ltr" dir="ltr"> </div>
<div class="dir-ltr" dir="ltr"> // A colour map of {r, g, b} triplets<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> boost::scoped_ptr<aRainbowColourMap> rainbowColourMapPtr(new aRainbowColourMap);<br></div>
<div class="dir-ltr" dir="ltr"> </div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> const vtkIdType nColours = static_cast<vtkIdType>(rainbowColourMapPtr->GetNColours()); // 256 colours<br></div>
<div class="dir-ltr" dir="ltr"> </div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> vtkSmartPointer<vtkWindowLevelLookupTable> windowLevelLookupTable = vtkSmartPointer<vtkWindowLevelLookupTable>::New();<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> windowLevelLookupTable->SetWindow( window);<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> windowLevelLookupTable->SetLevel( level);<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span> windowLevelLookupTable->SetNumberOfTableValues( nColours);<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span> for( vtkIdType iC = 0; iC < nColours; ++iC)<br></div>
<div><span class="Apple-tab-span"></span> {<br></div>
<div><span class="Apple-tab-span"></span> double r; <span class="size" style="font-size:13px">double g; </span><span class="size" style="font-size:13px"> double b; </span><br></div>
<div> </div>
<div><span class="size" style="font-size:13px"> rainbowColourMapPtr->GetRGB</span><span class="size" style="font-size:13px">( iC</span><span class="size" style="font-size:13px">, r</span><span class="size" style="font-size:13px">, g</span><span class="size" style="font-size:13px">, b );</span><br></div>
<div> </div>
<div><span class="Apple-tab-span"></span> windowLevelLookupTable->SetTableValue<span class="size" style="font-size:13px">( iC</span><span class="size" style="font-size:13px">, r</span><span class="size" style="font-size:13px">, g</span><span class="size" style="font-size:13px">, b</span><span class="size" style="font-size:13px">, 1.0 );</span><br></div>
<div><span class="Apple-tab-span"></span> }<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span> windowLevelLookupTable->SetRampToLinear();<br></div>
<div><span class="Apple-tab-span"></span> windowLevelLookupTable->Build();<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span> resliceImageViewer->SetLookupTable( windowLevelLookupTable); <br></div>
<div><span class="Apple-tab-span"></span>}<br></div>
<div><span class="Apple-tab-span"></span>else<br></div>
<div><span class="Apple-tab-span"></span>if( dicomModality == "MR" ) <br></div>
<div><span class="Apple-tab-span"></span>{<br></div>
<div> </div>
<div> // . . . Analogous code for MR here<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>}<br></div>
<div><span class="Apple-tab-span"></span>else<br></div>
<div><span class="Apple-tab-span"></span>if( dicomModality == "CT" ) <br></div>
<div><span class="Apple-tab-span"></span>{<br></div>
<div> // . . . Analogous code for CT here<br></div>
<div><span class="Apple-tab-span"></span><span class="size" style="font-size:13px">}</span><br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>// Callback functions<br></div>
<div><span class="Apple-tab-span"></span>// 1/ Close and exit vtk window<br></div>
<div><span class="Apple-tab-span"></span>vtkSmartPointer<vtkCallbackCommand> keypressCallback = vtkSmartPointer<vtkCallbackCommand>::New();<br></div>
<div><span class="Apple-tab-span"></span>keypressCallback->SetCallback( KeypressCallbackFunction);<br></div>
<div><span class="Apple-tab-span"></span>renderWindowInteractor->AddObserver<span class="size" style="font-size:13px">( vtkCommand::KeyPressEvent</span><span class="size" style="font-size:13px">, keypressCallback );</span><br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>resliceImageViewer->SetupInteractor( renderWindowInteractor);<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>// Initialize rendering and interaction<br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer->GetRenderWindow()->SetSize<span class="size" style="font-size:13px">( 900</span><span class="size" style="font-size:13px">, 900 );</span><br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer->GetRenderer()->SetBackground<span class="size" style="font-size:13px">( 0.0</span><span class="size" style="font-size:13px">, 0.0</span><span class="size" style="font-size:13px">, 0.0 );</span><br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>resliceImageViewer->GetRenderer()->ResetCamera();<br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer->SliceScrollOnMouseWheelOn();<br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer->Render();<br></div>
<div> </div>
<div><span class="Apple-tab-span"></span>renderWindowInteractor->Initialize();<span class="Apple-tab-span"></span><br></div>
<div><span class="Apple-tab-span"></span>renderWindowInteractor->Start();<br></div>
<div> </div>
</body>
</html>