<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>Hello vtk users,<br></div>
<div>&nbsp;</div>
<div>Have run into a problem/puzzle with regards to the Window/Level adjustment settings in&nbsp;vtkResliceImageViewer.<br></div>
<div>[It's a very useful class, btw, so thanks to it's developers.]<br></div>
<div>&nbsp;</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>&nbsp;</div>
<div>The code [relevant fragment is below] reads the DICOM data and displays it as expected [re PT_before.jpg].<br></div>
<div>&nbsp;</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>&nbsp;</div>
<div>So,&nbsp;<br></div>
<div>&nbsp;</div>
<div>Is there something missing or wrong from the code below?<br></div>
<div>&nbsp;</div>
<div>Is the Window/Level change functionality missing from&nbsp;vtkResliceImageViewer?<br></div>
<div>&nbsp;</div>
<div>Is there a callback that I need to add? If so, is there a sample code fragment somewhere?<br></div>
<div>&nbsp;</div>
<div>Any insight would be appreciated.<br></div>
<div>&nbsp;</div>
<div>Audrius<br></div>
<div>&nbsp;</div>
<div>&nbsp;</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>&nbsp;</div>
<div>Code fragment:<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>vtkSmartPointer&lt;vtkGDCMImageReader&gt; imageReader = vtkSmartPointer&lt;vtkGDCMImageReader&gt;::New();<br></div>
<div>&nbsp;</div>
<div>// . . . gets the DICOM data here<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>// Scalar image data display<br></div>
<div><span class="Apple-tab-span"></span>vtkSmartPointer&lt;vtkResliceImageViewer&gt; resliceImageViewer = vtkSmartPointer&lt;vtkResliceImageViewer&gt;::New();<br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer-&gt;SetInput( imageReader-&gt;GetOutput()); //<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>std::string dicomModality = imageReader-&gt;GetMedicalImageProperties()-&gt;GetModality();<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>if( dicomModality == "PT" ||<br></div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp; dicomModality == "NM" ||&nbsp;<br></div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp; dicomModality == "ST" )&nbsp;<br></div>
<div><span class="Apple-tab-span"></span>{<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp; std::cout &lt;&lt; "DICOM modality: " &lt;&lt; dicomModality &lt;&lt; std::endl;<br></div>
<div class="dir-ltr" dir="ltr">&nbsp;</div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp; double window;<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp; double level;&nbsp;<br></div>
<div class="dir-ltr" dir="ltr">&nbsp;</div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp; imageReader-&gt;GetMedicalImageProperties()-&gt;GetNthWindowLevelPreset&nbsp;<span class="size" style="font-size:13px">( 0</span><span class="size" style="font-size:13px">, &amp;window</span><span class="size" style="font-size:13px">, &amp;level );</span><br></div>
<div class="dir-ltr" dir="ltr">&nbsp;</div>
<div class="dir-ltr" dir="ltr">&nbsp; &nbsp;// A colour map of {r, g, b} triplets<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp;boost::scoped_ptr&lt;aRainbowColourMap&gt; rainbowColourMapPtr(new aRainbowColourMap);<br></div>
<div class="dir-ltr" dir="ltr">&nbsp;</div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp;const vtkIdType nColours = static_cast&lt;vtkIdType&gt;(rainbowColourMapPtr-&gt;GetNColours()); // 256 colours<br></div>
<div class="dir-ltr" dir="ltr">&nbsp;</div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp;vtkSmartPointer&lt;vtkWindowLevelLookupTable&gt; windowLevelLookupTable = vtkSmartPointer&lt;vtkWindowLevelLookupTable&gt;::New();<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp;windowLevelLookupTable-&gt;SetWindow( window);<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp;windowLevelLookupTable-&gt;SetLevel( level);<br></div>
<div class="dir-ltr" dir="ltr"><span class="Apple-tab-span"></span>&nbsp; &nbsp;windowLevelLookupTable-&gt;SetNumberOfTableValues( nColours);<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp;for( vtkIdType iC = 0; iC &lt; nColours; ++iC)<br></div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp;{<br></div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp; &nbsp; double r;&nbsp;<span class="size" style="font-size:13px">double g;&nbsp;</span><span class="size" style="font-size:13px">&nbsp;double b;&nbsp;</span><br></div>
<div>&nbsp;</div>
<div><span class="size" style="font-size:13px">&nbsp; &nbsp; &nbsp; rainbowColourMapPtr-&gt;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>&nbsp;</div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp; &nbsp; windowLevelLookupTable-&gt;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>&nbsp; &nbsp;}<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp;windowLevelLookupTable-&gt;SetRampToLinear();<br></div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp;windowLevelLookupTable-&gt;Build();<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>&nbsp; &nbsp;resliceImageViewer-&gt;SetLookupTable( windowLevelLookupTable);&nbsp;<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" )&nbsp;<br></div>
<div><span class="Apple-tab-span"></span>{<br></div>
<div>&nbsp;</div>
<div>&nbsp; &nbsp;// . . . Analogous code for MR here<br></div>
<div>&nbsp;</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" )&nbsp;<br></div>
<div><span class="Apple-tab-span"></span>{<br></div>
<div>&nbsp; &nbsp;// . . . &nbsp;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>&nbsp;</div>
<div><span class="Apple-tab-span"></span>vtkSmartPointer&lt;vtkRenderWindowInteractor&gt; renderWindowInteractor = vtkSmartPointer&lt;vtkRenderWindowInteractor&gt;::New();<br></div>
<div>&nbsp;</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&lt;vtkCallbackCommand&gt; keypressCallback = vtkSmartPointer&lt;vtkCallbackCommand&gt;::New();<br></div>
<div><span class="Apple-tab-span"></span>keypressCallback-&gt;SetCallback( KeypressCallbackFunction);<br></div>
<div><span class="Apple-tab-span"></span>renderWindowInteractor-&gt;AddObserver<span class="size" style="font-size:13px">( vtkCommand::KeyPressEvent</span><span class="size" style="font-size:13px">, keypressCallback );</span><br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>resliceImageViewer-&gt;SetupInteractor( renderWindowInteractor);<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>// Initialize rendering and interaction<br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer-&gt;GetRenderWindow()-&gt;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-&gt;GetRenderer()-&gt;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>&nbsp;</div>
<div><span class="Apple-tab-span"></span>resliceImageViewer-&gt;GetRenderer()-&gt;ResetCamera();<br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer-&gt;SliceScrollOnMouseWheelOn();<br></div>
<div><span class="Apple-tab-span"></span>resliceImageViewer-&gt;Render();<br></div>
<div>&nbsp;</div>
<div><span class="Apple-tab-span"></span>renderWindowInteractor-&gt;Initialize();<span class="Apple-tab-span"></span><br></div>
<div><span class="Apple-tab-span"></span>renderWindowInteractor-&gt;Start();<br></div>
<div>&nbsp;</div>
</body>
</html>