<div dir="ltr">You said "I can not use vtkImageMapToColors without LUT, because the application is crashing" but you posted code, and an output image that the code produced.  So I am confused.  Did the code crash?  Or did it just display an error message?<br><div><br></div><div><br></div><div>I'll try my best to give an explanation of how the VTK 3D image display pipeline works.</div><div><br></div><div>The vtkImageActor can, by itself, apply a window/level to the image.  To set this window/level, use these methods:<br></div><div><br></div><div>m_pImageActor->GetProperty()->SetColorWindow(w);<br></div><div>m_pImageActor->GetProperty()->SetColorLevel(l);<br></div><div><br></div><div>By default, the window/level for vtkImageActor are set to window=255.0, level=127.5. This window and level provide a range of [0.0, 255.0].  This is the full display range for 8-bits.  Converting between "window, level" and "range" is simple mathematics, and is described in many books and on many web pages, e.g. <a href="http://docs.oracle.com/cd/E19253-01/817-7519/6mmr6chkl/index.html">http://docs.oracle.com/cd/E19253-01/817-7519/6mmr6chkl/index.html</a></div><div><br></div><div>When you have vtkImageMapToColors in your pipeline, it will take your CT data (16 bits) as input, and it will produce RGBA (8-bits per component) data as output.  But it can only do this if you give it a lookup table.  If you do not give a lookup table, then it will display an error message, and it will output the original CT data, and then the vtkImageActor will apply its own default window/level of window=255.0, level=127.5.  This window/level does not come from the data!  It is simply the default window/level for vtkImageActor.</div><div><br></div><div>When you give a LUT to vtkImageMapToColors, it produces RGBA data as output (with 8-bits per component).  The vtkImageActor then applies its default window/level of 255.0,127.5 but note that, for 8-bit data, this window/level is an identity mapping!  A value of zero maps to zero, and a value of 255 maps to 255.  This means the mapping is controlled completely by the range of the LUT used with vtkImageMapToColors.  The vtkImageActor doesn't change the values at all.</div><div><br></div><div><br></div><div>So, now let us consider the two output images that you posted.  In the first one, it looks like you set the range of the LUT to [-5, 75], based on the fact that the image says <span style="font-size:12.8px">(W: 80, L: 35).  As I said in my previous email, you will have to tell me where those numbers came from!  Using </span><span style="font-size:12.8px">(W: 80, L: 35) only makes sense if you want to look at the brain, it is of course useless for bone because it saturates the bone (that is, it makes the bone completely white as you described).  So a doctor will use this window/level if they are looking for a brain injury such as a hemorrhage.  If they are interested in looking at bone injury, they will start with something like </span><span style="font-size:12.8px">(W: 3000, L: 1000).</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">For the second image you posted (the one with no LUT) the vtkImageActor is applying its default </span><span style="font-size:12.8px">(W: 255.0, L: 127.5) which is a large window than </span><span style="font-size:12.8px">(W: 80, L: 35) but is definitely smaller than you want.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">So I'll ask yet again... where did you get the values 80, 35?  From the DICOM meta data?  If so, they are obviously valid values (as I said, they are what a radiologist might use for investigating brain injury) even if they aren't the values that you want to use.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px"> - David</span></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 19, 2016 at 8:41 AM, David Gobbi <span dir="ltr"><<a href="mailto:david.gobbi@gmail.com" target="_blank">david.gobbi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">And the values (W: 80, L: 35) that are shown on the image... where do they come from?</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 19, 2016 at 7:30 AM, Flaviu2 <span dir="ltr"><<a href="mailto:flaviu2@yahoo.com" target="_blank">flaviu2@yahoo.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div style="color:#000;background-color:#fff;font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px"><div><span>David, I cannot thank you enough for your kindness.</span></div><div><span>Yes, I post the code used for case without LUT:</span></div><div><span></span><br></div><div><span></span><br></div><div dir="ltr"><span><span>    vtkDICOMReader* m_pDICOMReader = vtkDICOMReader::New();<br>    m_pDICOMReader->RemoveAllInputs();<br>    vtkDICOMApplyRescale* m_pRescale = vtkDICOMApplyRescale::New();<br>    m_pDICOMReader->SetFileNames(pFN); // all files from serie<br>    m_pDICOMReader->AutoRescaleOff();<br>    m_pDICOMReader->Update();<br>    m_pRescale->SetInputConnection(m_pDICOMReader->GetOutputPort());<br>    m_pRescale->Update();<br>    vtkImageReslice* m_pResliceAxial = vtkImageReslice::New();<br>    m_pResliceAxial->SetInputConnection(m_pRescale->GetOutputPort());<br></span><span>    vtkImageMapToColors* m_pColorAxial = vtkImageMapToColors::New();<br></span><span>    m_pColorAxial->SetInputConnection(m_pResliceAxial->GetOutputPort());<br>    vtkImageActor* m_pImageActor = vtkImageActor::New();<br>    // and then, forward, setup m_pColorAxial to an image actor:<br>    pImageActor->GetMapper()->SetInputConnection(m_pColorAxial->GetOutputPort());<br>    // and add image actor to a renderer<br>    m_pRenderer->AddActor(m_pImageActor);</span></span></div><div><br></div><div dir="ltr">In fact, I am using the same code, but I am not using vtkLookupTable at all ... I know, it is not quite ok, but it is the only way to have the original window level from the image ...</div><div dir="ltr"><br></div><div dir="ltr">Flaviu.</div><div><div><span><div><br></div><div dir="ltr"><br></div></span><div><span></span><br></div><div><span></span><br></div> <div><br><br></div><div style="display:block"> <div style="font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px"> <div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px"> <div dir="ltr"><font face="Arial" size="2"> On Thursday, May 19, 2016 4:03 PM, David Gobbi <<a href="mailto:david.gobbi@gmail.com" target="_blank">david.gobbi@gmail.com</a>> wrote:<br></font></div>  <br><br> <div><div><div><div dir="ltr">I will try to answer your question, but I need to know more about your code first.  Can you post the code you used for the "Snapshot_without_LUT" image?  In particular, the screenshot has a Window/Level annotation (W: 80, L: 35), so show me how those values are used in the code.<div><br clear="none"><div><div>On Thu, May 19, 2016 at 6:35 AM, Flaviu2 <span dir="ltr"><<a href="mailto:flaviu2@yahoo.com" rel="nofollow" shape="rect" target="_blank">flaviu2@yahoo.com</a>></span> wrote:<br clear="none"><blockquote style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div><div style="color:rgb(0,0,0);font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;background-color:rgb(255,255,255)"><div dir="ltr">Hi David. Something strange is happen ... I had tried to set LUT as you said, but the image are still whiter than without LUT ... see attached images ...</div><div dir="ltr"><br clear="none"></div><div dir="ltr">And of course, I can not use vtkImageMapToColors without LUT, because the application is crashing ... is there a solution here ?</div><div dir="ltr"><br clear="none"></div><div dir="ltr">Flaviu.<br clear="none"></div><div><div>  <div><br clear="none"><br clear="none"></div><div style="display:block"> <div style="font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px"> <div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px"> <div dir="ltr"><font face="Arial" size="2"> </font><font face="Arial" size="2"><br clear="none"></font></div><div><div><div><div style="color:rgb(0,0,0);font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;background-color:rgb(255,255,255)"><div><div style="display:block"><div style="font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px"><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px">  <br clear="none"><br clear="none"> <div><div><div><div dir="ltr">Hi Flaviu,<div><br clear="none"></div><div>This is incorrect:</div><div><br clear="none"></div><div>m_pLUTAxial->SetRange(dLevel, dWindow);<br clear="none"></div><div><br clear="none"></div><div>It should be something like this:</div><div><br clear="none"></div><div><div>m_pLUTAxial->SetRange(dLevel - 0.5*dWindow, dLevel + 0.5*dWindow);</div></div><div><br clear="none"></div><div> - David</div><div><br clear="none"></div></div><div><div><br clear="none"><div>On Fri, May 13, 2016 at 1:22 AM, Flaviu2 <span dir="ltr"><<a href="mailto:flaviu2@yahoo.com" rel="nofollow" shape="rect" target="_blank">flaviu2@yahoo.com</a>></span> wrote:<br clear="none"><blockquote style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div><div style="color:rgb(0,0,0);font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;background-color:rgb(255,255,255)"><div><span></span></div><div>This is a little pseudocode of the entire pipeline:</div><div><br clear="none"></div><div>      vtkDICOMReader* m_pDICOMReader = vtkDICOMReader::New();</div><div>
</div><div> m_pDICOMReader->RemoveAllInputs();</div><div>
</div><div> vtkDICOMApplyRescale* m_pRescale = vtkDICOMApplyRescale::New();</div><div>

</div><div dir="ltr">     m_pDICOMReader->SetFileNames(pFN); // all files from serie</div><div>
</div><div> m_pDICOMReader->AutoRescaleOff();</div><div>
</div><div> m_pDICOMReader->Update();</div><div>
</div><div> m_pRescale->SetInputConnection(m_pDICOMReader->GetOutputPort());</div><div>
</div><div> m_pRescale->Update();</div><div>

</div><div> vtkImageReslice* m_pResliceAxial = vtkImageReslice::New();</div><div>
</div><div> m_pResliceAxial->SetInputConnection(m_pRescale->GetOutputPort());</div><div>

</div><div> vtkLookupTable* m_pLUTAxial = vtkLookupTable::New();</div><span></span><div>

</div><div> m_pLUTAxial->SetValueRange(0.0, 1.0); <font color="#008000">// from black to white</font></div><div><font color="#008000">
</font></div><div>    m_pLUTAxial->SetSaturationRange(0.0, 0.0); <font color="#008000">// no color saturation</font></div><div><font color="#008000">

</font></div><div>    vtkDICOMMetaData* pMeta = m_pDICOMReader->GetMetaData();</div><div>
</div><div> <font color="#0000ff">const</font> vtkDICOMValue& window = pMeta->GetAttributeValue(DC::WindowWidth);</div><div>
</div><div> <font color="#0000ff">const</font> vtkDICOMValue& level = pMeta->GetAttributeValue(DC::WindowCenter);</div><div>
</div><div> <font color="#0000ff">double</font> dWindow = window.AsDouble();</div><div>
</div><div> <font color="#0000ff">double</font> dLevel = level.AsDouble();</div><div>

</div><div> m_pLUTAxial->SetRange(dLevel, dWindow); <font color="#008000">// image intensity range</font></div><div><font color="#008000">
</font></div><div>    m_pLUTAxial->SetRampToLinear();</div><div>
</div><div> m_pLUTAxial->Build();</div><div>

</div><div> vtkImageMapToColors* m_pColorAxial = vtkImageMapToColors::New();</div><div>
</div><div> m_pColorAxial->SetLookupTable(m_pLUTAxial);</div><div>
</div><div> m_pColorAxial->SetInputConnection(m_pResliceAxial->GetOutputPort());</div><div>

</div><div> vtkImageActor* m_pImageActor = vtkImageActor::New();</div><div>
</div><div> <font color="#008000">// and then, forward, setup m_pColorAxial to an image actor:</font></div><div><font color="#008000">
</font></div><div>    pImageActor->GetMapper()->SetInputConnection(m_pColorAxial->GetOutputPort());</div><div>
</div><div> <font color="#008000">// and add image actor to a renderer</font></div><div><font color="#008000">
</font></div><div>    m_pRenderer->AddActor(m_pImageActor);</div><div dir="ltr"><br clear="none"></div><div style="display:block"><div style="font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px"><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px"><div><div><div><div style="color:rgb(0,0,0);font-family:Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;background-color:rgb(255,255,255)"><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block"><font face="Arial" size="2"></font><br clear="none"></div><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block" dir="ltr">I had taken "Window center" and "Window width" and put them as range on lookuptable ... the image are little dark, and is not like the original (without setup lookup table looks good, but I get those warning like in post subject) ... might not understand well what you said about this range, but I am feel I am not far from solve this problem ... can you guide me a little bit ?</div><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block" dir="ltr"><br clear="none"></div><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block" dir="ltr">Flaviu.</div><span><font face="Arial" size="2"></font></span><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block"><br clear="none"></div><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block"><br clear="none"></div><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block" dir="ltr"><br clear="none"></div><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block"><font face="Arial" size="2"></font>  <br clear="none"><br clear="none"> </div><div style="font-family:HelveticaNeue,Helvetica Neue,Helvetica,Arial,Lucida Grande,sans-serif;font-size:16px;display:block"><div><div><div dir="ltr">Since you're already using vtk-dicom, you can use vtkDICOMApplyRescale<div>to convert your CT image to Hounsfield units (if you use this filter, you should</div><div>also call AutoRescaleOff() on the reader).</div><div><br clear="none"></div><div>After the image has been converted to Hounsfield units, you can use the</div><div>"Window Center" and "Window Width" presets that are stored in the meta</div><div>data to set the range for the lookup table.</div><div><br clear="none"></div><div>However, I usually ignore these presets, and instead use the VTK class</div><div>vtkImageHistogramStatistics to compute the range.  Its GetAutoRange()</div><div>computes a range by doing some simple histogram analysis.</div><div><br clear="none"></div><div>If you enjoy doing a lot of reading, the relevant parts the DICOM standard</div><div>are here:</div><div><a href="http://dicom.nema.org/MEDICAL/Dicom/current/output/chtml/part03/sect_C.11.html" rel="nofollow" shape="rect" target="_blank">http://dicom.nema.org/MEDICAL/Dicom/current/output/chtml/part03/sect_C.11.html</a></div><div><br clear="none"></div><div>After the image goes through vtkImageMapToColors, how are you</div><div>rendering it?</div><div><br clear="none"></div><div> - David<br clear="none"><br clear="none"></div></div></div></div></div></div></div></div></div>  </div> </div>  </div></div></div></blockquote></div><br clear="none"></div></div></div></div><br clear="none"><br clear="none"></div>  </div> </div>  </div></div></div></div></div><br clear="none"><br clear="none"></div>  </div> </div>  </div></div></div></div></div></blockquote></div></div><br clear="none"></div></div></div></div><br><br></div>  </div> </div>  </div></div></div></div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>