//----------------------------------------------------------------------------
void ColorLayerImageView::ConfigLookupTable() // virtual
{
- // CM
+ // CM 2014
+ // EED 28/01/2015
+
// Grey level extrema retrieved from the image grey level extrema.
-
GetImage()->GetScalarRange(_range);
-
-
+ double minRange = _range[0];
+ double maxRange = _range[1];
// ------------------ Setting Default Values
// Checks the size consistency of vectors _base_color and _grey_level_boundary.
// In case of inconsistency, an exception should be thrown. Instead, the default values are set.
if (GetBaseColorNb() == 0)
- SetDefaultBaseColorAndGreyLevelBoundary();
-
- // If at least one color has been set, set the grey level boundaries to build an equipartition of the image grey levels, keeping the base colors defined.
- else
- if (GetBaseColorNb() != (_grey_level_boundary.size() - 1) )
+ {
+ SetDefaultBaseColorAndGreyLevelBoundary();
+ }
+ else { // If at least one color has been set, set the grey level boundaries to build an equipartition of the image grey levels, keeping the base colors defined.
+ if (GetBaseColorNb() != (_grey_level_boundary.size() - 1) )
{
- std::cout << "CM ColorLayerImageView::ConfigLookupTable : ERROR!!! Inconsistency between the sizes of vectors _base_color and _grey_level_boundary. _base_color.size()/3 (=" <<_base_color.size()/3 << ") should be equal to _grey_level_boundary.size() - 1 (=" << _grey_level_boundary.size() - 1 << ")." << std::endl;
- std::cout << "CM The default values for the base colors and the grey level boundaries will be set." << std::endl;
- SetDefaultGreyLevelBoundary();
+ std::cout << "CM ColorLayerImageView::ConfigLookupTable : ERROR!!! Inconsistency between the sizes of vectors _base_color and _grey_level_boundary. _base_color.size()/3 (=" <<_base_color.size()/3 << ") should be equal to _grey_level_boundary.size() - 1 (=" << _grey_level_boundary.size() - 1 << ")." << std::endl;
+ std::cout << "CM The default values for the base colors and the grey level boundaries will be set." << std::endl;
+ SetDefaultGreyLevelBoundary();
}
+ }
// ------------------ End Of Setting Default Values
-
// ------------------ Defining the Threshold Table
vtkLookupTable* thresholdTable = GetThresholdTable();
+ double thresholdTable_range[2];
+ double r1,r2,g1,g2,b1,b2;
+ int start,end;
// CM Number of table values consistent with the effective number of values (see loop below).
- double thresholdTable_range[2];
- thresholdTable_range[1]= std::max( GetGreyLevelBoundaries( GetBaseColorNb() ), ceil(_range[1]) );
- thresholdTable_range[0]= std::min( GetGreyLevelBoundaries(0), floor(_range[0]) );
- thresholdTable->SetNumberOfTableValues(thresholdTable_range[1] - thresholdTable_range[0] + 1);
+ thresholdTable_range[1]= std::max( GetGreyLevelBoundaries( _grey_level_boundary.size()-1 ) , ceil(_range[1]) );
+ thresholdTable_range[0]= std::min( GetGreyLevelBoundaries(0) , floor(_range[0]) );
+
thresholdTable->SetTableRange(thresholdTable_range);
thresholdTable->SetAlphaRange(0, 1);
thresholdTable->SetValueRange(0, 1);
-
thresholdTable->SetSaturationRange(0, 0);
thresholdTable->SetRampToLinear( );
+ thresholdTable->SetNumberOfTableValues(1000);
+
+
// Defines the lookup table.
// If the image has a degradation in one (or both) extremum (lower or higher),
// sets the corresponding grey levels as transparent white in the lookup table.
- for (int i = floor(_range[0]); i <= GetGreyLevelBoundaries(0); i++)
- {
- thresholdTable -> SetTableValue( i, 0, 0, 0, 0);
- }
- for (int i = GetGreyLevelBoundaries( GetBaseColorNb() ) + 1 ; i <= ceil(_range[1]); i++)
- {
- thresholdTable -> SetTableValue( i, 0, 0, 0, 0);
- }
-
- int delta;
// _color_type true, i.e. plain colors.
// Sets the plain color for each grey level interval.
if (_color_type)
- {
- for (int i = 0; i < GetBaseColorNb(); i++)
- {
- delta = GetGreyLevelBoundaries(i+1) - GetGreyLevelBoundaries(i);
- for (int ii = 1; ii <= delta; ii++)
- {
- thresholdTable->SetTableValue(GetGreyLevelBoundaries(i) + ii,
+ {
+// thresholdTable->SetNumberOfTableValues(thresholdTable_range[1] - thresholdTable_range[0] + 1);
+
+ if ( minRange<GetGreyLevelBoundaries(0) )
+ {
+ start = 0;
+ end = 1000*(GetGreyLevelBoundaries(0)-minRange) / (maxRange-minRange);
+ FillColorTable(start,end, 0,0,0, 0,0,0);
+ }
+
+ if ( maxRange>GetGreyLevelBoundaries( _grey_level_boundary.size()-1 ) )
+ {
+ start = 1000*(GetGreyLevelBoundaries( _grey_level_boundary.size()-1 )-minRange) / (maxRange-minRange);;
+ end = 1000*(maxRange-minRange) / (maxRange-minRange);
+ FillColorTable(start,end, 0,0,0, 0,0,0);
+ }
+
+ int delta;
+ for (int iColor = 0; iColor < GetBaseColorNb(); iColor++)
+ {
+
+ start = 1000*(GetGreyLevelBoundaries(iColor)-minRange) / (maxRange-minRange);
+ end = 1000*(GetGreyLevelBoundaries(iColor+1)-minRange) / (maxRange-minRange);
+
+ r1 = GetBaseColors(iColor*3+0);
+ g1 = GetBaseColors(iColor*3+1);
+ b1 = GetBaseColors(iColor*3+2);
+
+ FillColorTable(start,end, r1,g1,b1,r1,g1,b1);
+
+/*
+ delta = GetGreyLevelBoundaries(i+1) - GetGreyLevelBoundaries(i);
+ for (int ii = 1; ii <= delta; ii++)
+ {
+ thresholdTable->SetTableValue(GetGreyLevelBoundaries(i) + ii,
GetBaseColors(i*3),
GetBaseColors(i*3 + 1),
GetBaseColors(i*3 + 2),
1);
- }
- }
- } // End Of if (_color_type)
+ } // for ii
+*/
+
+ } // for i
+ } // End Of if (_color_type)
-
// _color_type false, i.e. gradient color
else
- {
- // First color:
- // Creates a linear range from white to the first color.
- delta = GetGreyLevelBoundaries(1) - GetGreyLevelBoundaries(0);
- for (int ii = 1; ii <= delta ; ii++)
- {
- thresholdTable->SetTableValue( (GetGreyLevelBoundaries(0) + ii), GetBaseColors(0) * ii/delta,
- GetBaseColors(1) * ii/delta, GetBaseColors(2) * ii/delta, 1);
- }
-
- // If other colors exist:
- // Creates linear ranges between one color and the following in the color vector.
+ {
+//EED 28/01/2015
+ thresholdTable->SetNumberOfTableValues(1000);
if (GetBaseColorNb() > 1)
- {
- for (int i = 1; i < GetBaseColorNb(); i++)
- {
- delta = GetGreyLevelBoundaries(i+1) - GetGreyLevelBoundaries(i);
- for (int ii = 1; ii <= delta; ii++)
{
- // Color computation : previous_color + (current_color - previous_color)/delta * ii
- thresholdTable->SetTableValue((GetGreyLevelBoundaries(i) + ii),
- GetBaseColors((i-1)*3) + (GetBaseColors(i*3) - GetBaseColors((i-1)*3)) / delta * ii ,
- GetBaseColors((i-1)*3 + 1) + (GetBaseColors(i*3 + 1) - GetBaseColors((i-1)*3 + 1)) / delta * ii ,
- GetBaseColors((i-1)*3 + 2) + (GetBaseColors(i*3 + 2) - GetBaseColors((i-1)*3 + 2)) / delta * ii ,
- 1);
- }
- }
- }
- } // End Of if (!_color_type)
-
-
-
- thresholdTable->SetRange(_range[0], _range[1]); // image intensity range
- thresholdTable->SetValueRange(0.0, 1.0); // from black to white
-
+ for (int iColor = 0; iColor < GetBaseColorNb(); iColor++)
+ {
+ if (iColor==0)
+ {
+ r1 = 0;
+ g1 = 0;
+ b1 = 0;
+ } else {
+ r1 = GetBaseColors((iColor-1)*3+0);
+ g1 = GetBaseColors((iColor-1)*3+1);
+ b1 = GetBaseColors((iColor-1)*3+2);
+ } // if iColor == 0
+
+ r2 = GetBaseColors(iColor*3+0);
+ g2 = GetBaseColors(iColor*3+1);
+ b2 = GetBaseColors(iColor*3+2);
+ start = 1000*(GetGreyLevelBoundaries(iColor)-minRange) / (maxRange-minRange);
+ end = 1000*(GetGreyLevelBoundaries(iColor+1)-minRange) / (maxRange-minRange);
+ FillColorTable(start,end, r1,g1,b1,r2,g2,b2);
+ }// for
+ } //if
+ } // End Of if (!_color_type)
thresholdTable->Build( );
+ //EO CM EED
+}
-/*
-// Create a greyscale lookup table
+void ColorLayerImageView::FillColorTable(int start, int end, double r1, double g1, double b1, double r2, double g2, double b2)
+{
vtkLookupTable* thresholdTable = GetThresholdTable();
- thresholdTable->SetRange(0.5, 0.75); // image intensity range
- thresholdTable->SetValueRange(0.0, 1); // from black to white
- thresholdTable->SetHueRange(0.0, 1.0); // from black to white
- thresholdTable->SetSaturationRange(0.0, 1.0); // no color saturation
- thresholdTable->SetRampToLinear();
- thresholdTable->Build();
-*/
-
- // ------------------ End Of Defining the Threshold Table
-
- //EO CM
+ int iTable;
+ double delta = end-start;
+ double dr = (r2-r1)/delta;
+ double dg = (g2-g1)/delta;
+ double db = (b2-b1)/delta;
+ for (iTable=0; iTable<=delta; iTable++)
+ {
+ thresholdTable->SetTableValue( iTable+start , r1+dr*iTable, g1+dg*iTable, b1+db*iTable,1);
+ } // for iTable
}
// EOF
}
-//EED01
-//EED01 //----------------------------------------------------------------------------
-//EED01 void ColorLayerImageViewPanel::SetColorLayerImageView(ColorLayerImageView* colorLayerImageView)
-//EED01 {
-//EED01 _colorLayerImageView = colorLayerImageView;
-//EED01 }
-//EED01
-//EED01 //----------------------------------------------------------------------------
-//EED01 ColorLayerImageView* ColorLayerImageViewPanel::GetColorLayerImageView()
-//EED01 {
-//EED01 return _colorLayerImageView;
-//EED01 }
-
-
+//----------------------------------------------------------------------------
ColorLayerImageViewManager* ColorLayerImageViewPanel::GetColorLayerImageViewManager()
{
return _colorLayerImageViewManager;
}
+//----------------------------------------------------------------------------
// This is the new spacing of the background image (1,1,1)
void ColorLayerImageViewPanel::SetBaseSpacing(double spc[3])
{
_spcBase[2] = 1;
}
+//----------------------------------------------------------------------------
// This is the Original spacing of the background image
void ColorLayerImageViewPanel::SetOriginalSpacing(double spc[3])
{
_spcOrg[2] = spc[2];
}
+//----------------------------------------------------------------------------
// This is the size in pixels of the background image
void ColorLayerImageViewPanel::SetBaseDimension(int dim[3])
{
//----------------------------------------------------------------------------
void ColorLayerImageViewPanel::onSliceFixDinamic(wxCommandEvent& event)
{
-//EED01 if (_colorLayerImageView!=NULL)
-//EED01 {
bool fixdin = _cb_SliceFixDinamic->GetValue();
-//EED01 _colorLayerImageView->SetSliceFixDynamic( fixdin );
_colorLayerImageViewManager->SetSliceFixDynamic( fixdin );
if (fixdin==false)
{
-//EED01 _colorLayerImageView->SetZ2( _sl_SliceImage->GetValue() );
_colorLayerImageViewManager->SetX2( _sl_SliceImageX->GetValue() );
_colorLayerImageViewManager->SetY2( _sl_SliceImageY->GetValue() );
_colorLayerImageViewManager->SetZ2( _sl_SliceImageZ->GetValue() );
_sl_SliceImageX->Enable(!fixdin);
_sl_SliceImageY->Enable(!fixdin);
_sl_SliceImageZ->Enable(!fixdin);
-//EED01 _colorLayerImageView->onThreshold();
_colorLayerImageViewManager->onThreshold();
RefreshView();
-//EED01 }//_colorLayerImageView
}
//----------------------------------------------------------------------------
void ColorLayerImageViewPanel::onSliceImage(wxScrollEvent& event)
{
-//EED01 if (_colorLayerImageView!=NULL)
-//EED01 {
-//EED01 _colorLayerImageView->SetZ2( _sl_SliceImage->GetValue() );
-//EED01 _colorLayerImageView->onThreshold();
-//EED01 RefreshView();
- _colorLayerImageViewManager->SetX2( _sl_SliceImageX->GetValue() );
- _colorLayerImageViewManager->SetY2( _sl_SliceImageY->GetValue() );
- _colorLayerImageViewManager->SetZ2( _sl_SliceImageZ->GetValue() );
- _colorLayerImageViewManager->onThreshold();
+ _colorLayerImageViewManager->SetX2( _sl_SliceImageX->GetValue() );
+ _colorLayerImageViewManager->SetY2( _sl_SliceImageY->GetValue() );
+ _colorLayerImageViewManager->SetZ2( _sl_SliceImageZ->GetValue() );
+ _colorLayerImageViewManager->onThreshold();
RefreshView();
-//EED01 }//_colorLayerImageView
}
//----------------------------------------------------------------------------
void ColorLayerImageViewPanel::onChangeOpacity(wxScrollEvent& event)
{
-//EED01 if (_colorLayerImageView!=NULL)
-//EED01 {
int opacity = _opacity->GetValue();
-//EED01 _colorLayerImageView->onThresholdChangeOpacity(opacity);
_colorLayerImageViewManager->onThresholdChangeOpacity(opacity);
RefreshView();
-//EED01 }//_colorLayerImageView
}