<div dir="ltr">Hi Sophonet,<div><br></div><div>This code looks very fishy to me:</div><div><br></div><div>colorMap_->GetTableValue(255, aboveColor);<br></div><div><span style="font-size:12.8px">colorMap_->GetTableValue(0, belowColor);</span><br></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">You shouldn't call GetTableValue() before you have built the table.  If you haven't built the table, how do you know what colors are stored at positions 0 and 255?  They could be (0,0,0,0).</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px"> - David</span></div><div><span style="font-size:12.8px"><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 2, 2017 at 11:51 AM, Sophonet <span dir="ltr"><<a href="mailto:vtk12af6bc42@kant.sophonet.de" target="_blank">vtk12af6bc42@kant.sophonet.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">Hi David,<br>
<br>
here it is (needed to copy a few lines since the functionality is part of a class). Note that it contains your work-around twice, once, when setting an external colormap, and the second time when changing window/level.<br>
<br>
Oh, after pasting, it came into my mind that using an external color table might be the reason? In this case, I recall, Build() is not really needed anyway...<br>
<br>
Hope this helps. Thanks for looking into this so quickly,<br>
<br>
     Sophonet<br>
<br>
<br>
<br>
// Initialization<br>
vtkSmartPointer<vtkLookupTable<wbr>> colorMap_ = vtkSmartPointer<vtkLookupTable<wbr>>::New();<br>
vtkSmartPointer<vtkImageProper<wbr>ty> imageProperty_ = vtkSmartPointer<vtkImageProper<wbr>ty>::New();<br>
colorMap_->SetNumberOfTableVal<wbr>ues(256);<br>
colorMap_->SetRange(0, 1);<br>
<br>
imageProperty_->SetLookupTable<wbr>(colorMap_);<br>
imageProperty_->UseLookupTable<wbr>ScalarRangeOn();<br>
<br>
imageSlice_->SetProperty(image<wbr>Property_);<br>
<br>
<br>
// Setting color map from external RGBA array<br>
colorMap_->SetTable(colorArray<wbr>); // please see below how I have set up the array...<br>
double aboveColor[4];<br>
double belowColor[4];<br>
colorMap_->GetTableValue(255, aboveColor);<br>
colorMap_->SetAboveRangeColor(<wbr>aboveColor);<br>
colorMap_->UseAboveRangeColorO<wbr>n();<br>
colorMap_->GetTableValue(0, belowColor);<br>
colorMap_->SetBelowRangeColor(<wbr>belowColor);<br>
colorMap_->UseBelowRangeColorO<wbr>n();<br>
colorMap_->SetNumberOfTableVal<wbr>ues(256);<br>
colorMap_->Build();<br>
<br>
// Callback for level / window<br>
double minmax[2];<br>
minmax[0] = windowLevel_[1] - 0.5*windowLevel_[0];<br>
minmax[1] = windowLevel_[1] + 0.5*windowLevel_[0];<br>
colorMap_->SetRange(minmax);<br>
double aboveColor[4];<br>
double belowColor[4];<br>
colorMap_->GetTableValue(255, aboveColor);<br>
colorMap_->SetAboveRangeColor(<wbr>aboveColor);<br>
colorMap_->UseAboveRangeColorO<wbr>n();<br>
colorMap_->GetTableValue(0, belowColor);<br>
colorMap_->SetBelowRangeColor(<wbr>belowColor);<br>
colorMap_->UseBelowRangeColorO<wbr>n();<br>
colorMap_->SetNumberOfTableVal<wbr>ues(256);<br>
colorMap_->Build();<br>
<br>
<br>
//////////////////////////////<wbr>////////<br>
const unsigned char grayscale[4*256] = {<br>
0, 0, 0, 255, 1, 1, 1, 255,<br>
// you can imagine how things continue. I have other more useful arrays for other color scales as well<br>
// ...<br>
};<br>
<br>
vtkSmartPointer<vtkUnsignedCha<wbr>rArray> colorArray = vtkSmartPointer<vtkUnsignedCha<wbr>rArray>::New();<br>
newMap->SetNumberOfValues(256)<wbr>;<br>
newMap->SetNumberOfComponents(<wbr>4);<br>
newMap->SetArray(const_cast<un<wbr>signed char *>(grayscale), 4 * 256, 1);<br>
<br>
<br>
<br>
Am 2017-02-02 18:51, schrieb David Gobbi:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Sophonet,<br>
<br>
Can you send the exact code that you use to set up the lookup table,<br>
including the call to Build(), so that I can check locally?<br>
<br>
 - David<br>
<br>
On Thu, Feb 2, 2017 at 10:42 AM, Sophonet<br>
<<a href="mailto:vtk12af6bc42@kant.sophonet.de" target="_blank">vtk12af6bc42@kant.sophonet.de</a><wbr>> wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Well, on my system your proposed change did not work, I still see<br>
transparent color when LUT clipping occurs, exactly as before. I<br>
have even copied your lines of your previous posting plus the<br>
Build() call below the SetRange() callback, in which I am doing<br>
level/windowing. Not sure why though - I might check again using the<br>
HEAD (I am on 7.1.0 release)<br>
<br>
- Sophonet<br>
<br>
Am 2017-02-02 18:08, schrieb David Gobbi:<br>
Okay, here is a very simple work-around for this issue: Just call<br>
Build() on the table after you have set all the other table<br>
parameters.  Please let me know if this fixes the issue.<br>
<br>
I've submitted a fix for mapper so that it will call Build()<br>
automatically.  I'm not sure why it didn't do this before.<br>
<br>
 - David<br>
<br>
On Thu, Feb 2, 2017 at 8:41 AM, David Gobbi <<a href="mailto:david.gobbi@gmail.com" target="_blank">david.gobbi@gmail.com</a>><br>
wrote:<br>
<br>
I've discovered more about this issue.  The Above/Below colors<br>
will<br>
work if you call SetNumberOfColors after turning them on:<br>
<br>
table->SetBelowRangeColor(1,0,<wbr>0,1);<br>
table->SetAboveRangeColor(0,1,<wbr>0,1);<br>
table->UseAboveRangeColorOn();<br>
table->UseBelowRangeColorOn();<br>
table->SetNumberOfColors(256);<br>
<br>
I'm still investigating to see why this happens.<br>
<br>
 - David<br>
<br>
On Thu, Feb 2, 2017 at 7:20 AM, David Gobbi <<a href="mailto:david.gobbi@gmail.com" target="_blank">david.gobbi@gmail.com</a>><br>
wrote:<br>
<br>
Hi Sophonet,<br>
<br>
I have confirmed that what you report is true: the<br>
vtkImageResliceMapper (and vtkImageSliceMapper) seem to ignore the<br>
AboveRangeColor and the BelowRangeColor.  This is also true for<br>
the<br>
current VTK master branch.  My current theory is that the mapper<br>
clamps the scalars to the range before they go through the lookup<br>
table.  Hopefully I'll have a fix for this soon.<br>
<br>
As a workaround (a inefficient workaround), you can use<br>
vtkImageMapToColors to apply the lookup table to the image before<br>
it<br>
goes to the mapper.<br>
<br>
 - David<br>
   <br>
<br>
On Thu, Feb 2, 2017 at 5:10 AM, Sophonet<br>
<<a href="mailto:vtk12af6bc42@kant.sophonet.de" target="_blank">vtk12af6bc42@kant.sophonet.de</a><wbr>> wrote:<br>
Dear list,<br>
<br>
for displaying images, I am using vtkImageResliceMapper. For<br>
changing the colormap, I set a dedicated color map to the<br>
imageSlice's property (which is a vtkLookupTable) and tell to use<br>
its scalar range:<br>
<br>
colorMap_->SetNumberOfTableVal<wbr>ues(256);<br>
colorMap_->SetRange(0, 1);<br>
<br>
imageProperty_->SetLookupTable<wbr>(colorMap_);<br>
imageProperty_->UseLookupTable<wbr>ScalarRangeOn();<br>
<br>
Now, when changing level/window interactively with the mouse, I am<br>
setting the range in the colorMap via<br>
<br>
double minmax[2];<br>
// set values of minmax correctly<br>
colorMap_->SetRange(minmax);<br>
<br>
The changes are displayed correctly - however, areas in which<br>
original scalars of the image are clipped, the resulting color is<br>
displayed as transparent. However, I would like to display the<br>
maximum / minimum value in the color table.<br>
<br>
I have tried using colorMap_->SetAboveRangeColor(<wbr>) and<br>
colorMap_->SetAboveRangeColorO<wbr>n() (likewise for ...BelowRange...),<br>
with no apparent effect.<br>
<br>
Any advice?<br>
<br>
I am using VTK 7.1.0.<br>
<br>
Thanks,<br>
<br>
     Sophonet<br>
</blockquote>
<br>
 _____________________________<wbr>__________________<br>
 Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a> [1]<br>
<br>
 Visit other Kitware open-source projects at<br>
<a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensou<wbr>rce/opensource.html</a> [2]<br>
<br>
 Please keep messages on-topic and check the VTK FAQ at:<br>
<a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK_FA<wbr>Q</a> [3]<br>
<br>
 Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=<wbr>vtkusers</a><br>
[4]<br>
<br>
 Follow this link to subscribe/unsubscribe:<br>
 <a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/mai<wbr>lman/listinfo/vtkusers</a> [5]<br>
<br>
<br>
<br>
Links:<br>
------<br>
[1] <a href="http://www.kitware.com" rel="noreferrer" target="_blank">http://www.kitware.com</a><br>
[2] <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensou<wbr>rce/opensource.html</a><br>
[3] <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK_FA<wbr>Q</a><br>
[4] <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=<wbr>vtkusers</a><br>
[5] <a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/mail<wbr>man/listinfo/vtkusers</a><br>
</blockquote></div></div>
______________________________<wbr>_________________<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><span class="im HOEnZb"><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensou<wbr>rce/opensource.html</a><br>
<br></span><span class="im HOEnZb">
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK_FA<wbr>Q</a><br>
<br></span><span class="im HOEnZb">
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=<wbr>vtkusers</a><br>
<br></span><div class="HOEnZb"><div class="h5">
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/mail<wbr>man/listinfo/vtkusers</a><br>
</div></div></blockquote></div><br></div>