-/*=========================================================================
+/*=========================================================================
Program: bbtk
Module: $RCSfile: bbvtkMIPCreator.cxx,v $
Language: C++
- Date: $Date: 2011/03/17 15:49:14 $
- Version: $Revision: 1.8 $
+ Date: $Date: 2011/03/23 15:26:55 $
+ Version: $Revision: 1.9 $
=========================================================================*/
/* ---------------------------------------------------------------------
* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
*
-* This software is governed by the CeCILL-B license under French law and
-* abiding by the rules of distribution of free software. You can use,
-* modify and/ or redistribute the software under the terms of the CeCILL-B
-* license as circulated by CEA, CNRS and INRIA at the following URL
-* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+* This software is governed by the CeCILL-B license under French law and
+* abiding by the rules of distribution of free software. You can use,
+* modify and/ or redistribute the software under the terms of the CeCILL-B
+* license as circulated by CEA, CNRS and INRIA at the following URL
+* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
* or in the file LICENSE.txt.
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
-* liability.
+* liability.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-B license and that you accept its terms.
-* ------------------------------------------------------------------------ */
+* ------------------------------------------------------------------------ */
/**
- * \file
- * \brief
+ * \file
+ * \brief
*/
#ifdef _USE_VTK_
{
BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,MIPCreator)
BBTK_BLACK_BOX_IMPLEMENTATION(MIPCreator,bbtk::AtomicBlackBox);
-
+
//---------------------------------------------------------------------
- void MIPCreator::bbUserSetDefaultValues()
- {
- bbSetInputShift(0);
- bbSetInputScale(1.0);
- mCast = NULL;
- mMIP = NULL;
- mMapper = NULL;
- mVolume = NULL;
+ void MIPCreator::bbUserSetDefaultValues()
+ {
+
+
+ std::vector<double> denPoints;
+ std::vector<double> opaValues;
+ denPoints.push_back(0.0);
+ denPoints.push_back(255.0);
+ opaValues.push_back(0.0);
+ opaValues.push_back(1.0);
+ bbSetInputDensityPoints(denPoints);
+ bbSetInputOpacityValues(opaValues);
+ bbSetInputMinColorWindow(0.0);
+ bbSetInputMaxColorWindow(255.0);
+
+ opacityTransferFunction = vtkPiecewiseFunction::New();
+ grayTransferFunction = vtkPiecewiseFunction::New();
+
+ mCast = NULL;
+ mMIP = NULL;
+ mMapper = NULL;
+ mVolume = NULL;
+
+
}
//---------------------------------------------------------------------
- void MIPCreator::bbUserInitializeProcessing()
- {
+ void MIPCreator::bbUserInitializeProcessing()
+ {
+
+
// Create the pipeline
mCast = vtkImageShiftScale::New();
mCast->SetOutputScalarTypeToUnsignedChar();
mCast->ClampOverflowOn();
-
-
-
- //define range of values
- vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New();
- opacityTransferFunction->AddPoint( 0 , 0.0/100.0 );
-// opacityTransferFunction->AddPoint( 85 , 2.0/100.0 );
-// opacityTransferFunction->AddPoint( 160 , 25.0/100.0 );
-// opacityTransferFunction->AddPoint( 210 , 50.0/100.0 );
- opacityTransferFunction->AddPoint( 255 , 90.0/100.0 );
-
-
- //Create a transfer function mapping scalar value to color (grey)
- vtkPiecewiseFunction *grayTransferFunction = vtkPiecewiseFunction::New();
- grayTransferFunction->AddSegment( 0 , 0.0 , 255 , 1.0 );
-
- // Create a set of properties for mip
- vtkVolumeProperty *mipProperty;
- mipProperty = vtkVolumeProperty::New();
- mipProperty->SetScalarOpacity( opacityTransferFunction );
- mipProperty->SetColor( grayTransferFunction );
-
-// mipProperty->SetInterpolationTypeToLinear();
- mipProperty->SetInterpolationTypeToNearest();
+ DensityPoints = bbGetInputDensityPoints();
+ OpacityValues = bbGetInputOpacityValues();
-// mipProperty->ShadeOff();
- mipProperty->ShadeOn();
+ while(DensityPoints.size()>OpacityValues.size())
+ {
+ OpacityValues.push_back(1.0);
+ }
- mipProperty->SetAmbient(0.9);
- mipProperty->SetDiffuse(0.9);
- mipProperty->SetSpecular(0.9);
-
-
- mMIP = vtkVolumeRayCastMIPFunction::New();
- mMIP->SetMaximizeMethodToScalarValue();
-// mMIP->SetMaximizeMethodToOpacity();
-
- mMapper = vtkVolumeRayCastMapper::New();
- mMapper->SetVolumeRayCastFunction(mMIP);
- mMapper->SetInput(mCast->GetOutput()); // (smoother.GetOutput())
-
- mVolume = vtkVolume::New();
- mVolume->SetMapper(mMapper);
- mVolume->SetProperty( mipProperty );
-
- // mMapper->ScalarVisibilityOff();
- // mMapper->ImmediateModeRenderingOn();
-
- bbSetOutputOut(mVolume);
}
//---------------------------------------------------------------------
- void MIPCreator::bbUserFinalizeProcessing()
- {
+ void MIPCreator::bbUserFinalizeProcessing()
+ {
if (mCast!=NULL)
{
mCast->Delete();
void MIPCreator::Process()
{
- mCast->SetInput( bbGetInputIn() );
- mCast->SetScale( bbGetInputScale() / 100.0 );
- mCast->SetShift( -bbGetInputShift() );
- mMapper->Update();
-
+
+
+ double ranges[2];
+ vtkImageData *image = bbGetInputIn();
+ image->Update();
+ image->GetScalarRange(ranges);
+
+ scale = 255/(ranges[1]/100);
+
+ mCast->SetInput( bbGetInputIn() );
+ mCast->SetScale( scale / 100.0 );
+ //mCast->SetShift( -bbGetInputShift() );
+
+
+ double factor = scale/ 100.0 ;
+
+
+ double minCF = bbGetInputMinColorWindow();
+ double maxCF = bbGetInputMaxColorWindow();
+ cout<<"MIPCreator::Process::minCF"<<minCF <<endl;
+ cout<<"MIPCreator::Process::maxCF"<<maxCF <<endl;
+ grayTransferFunction->AddSegment( minCF , 0.0 , maxCF , 1.0 );
+
+
+
+ for(int i =0; i< DensityPoints.size(); i++)
+ {
+
+ opacityTransferFunction->AddPoint(DensityPoints.at(i)*factor, OpacityValues.at(i));
+ }
+ //opacityTransferFunction = vtkPiecewiseFunction::New();
+// opacityTransferFunction->AddPoint( 0 , 0.0/100.0 );
+// opacityTransferFunction->AddPoint( 85 , 2.0/100.0 );
+// opacityTransferFunction->AddPoint( 160 , 25.0/100.0 );
+// opacityTransferFunction->AddPoint( 210 , 50.0/100.0 );
+// opacityTransferFunction->AddPoint( 255 , 90.0/100.0 );
+
+
+
+ // Create a set of properties for mip
+ vtkVolumeProperty *mipProperty;
+ mipProperty = vtkVolumeProperty::New();
+ mipProperty->SetScalarOpacity( opacityTransferFunction );
+ mipProperty->SetColor( grayTransferFunction );
+
+// mipProperty->SetInterpolationTypeToLinear();
+ mipProperty->SetInterpolationTypeToNearest();
+
+// mipProperty->ShadeOff();
+ mipProperty->ShadeOn();
+
+// mipProperty->SetAmbient(0.9);
+// mipProperty->SetDiffuse(0.9);
+// mipProperty->SetSpecular(0.9);
+
+
+
+
+
+ mMIP = vtkVolumeRayCastMIPFunction::New();
+ mMIP->SetMaximizeMethodToScalarValue();
+
+ mMapper = vtkVolumeRayCastMapper::New();
+ mMapper->SetVolumeRayCastFunction(mMIP);
+ mMapper->SetInput(mCast->GetOutput()); // (smoother.GetOutput())
+
+ mVolume = vtkVolume::New();
+ mVolume->SetMapper(mMapper);
+ mVolume->SetProperty( mipProperty );
+
+
+
+ mMapper->Update();
+
+ bbSetOutputOut(mVolume);
// mVolume->GetProperty()->SetColor( bbGetInputColour()[0], bbGetInputColour()[1], bbGetInputColour()[2] );
// mVolume->GetProperty()->SetOpacity( bbGetInputOpacity() );
-
+
+
}
}//namespace bbtk
-/*=========================================================================
+/*=========================================================================
Program: bbtk
Module: $RCSfile: bbvtkMIPCreator.h,v $
Language: C++
- Date: $Date: 2010/04/08 14:37:59 $
- Version: $Revision: 1.9 $
+ Date: $Date: 2011/03/23 15:26:55 $
+ Version: $Revision: 1.10 $
=========================================================================*/
/* ---------------------------------------------------------------------
* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
*
-* This software is governed by the CeCILL-B license under French law and
-* abiding by the rules of distribution of free software. You can use,
-* modify and/ or redistribute the software under the terms of the CeCILL-B
-* license as circulated by CEA, CNRS and INRIA at the following URL
-* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+* This software is governed by the CeCILL-B license under French law and
+* abiding by the rules of distribution of free software. You can use,
+* modify and/ or redistribute the software under the terms of the CeCILL-B
+* license as circulated by CEA, CNRS and INRIA at the following URL
+* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
* or in the file LICENSE.txt.
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
-* liability.
+* liability.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-B license and that you accept its terms.
-* ------------------------------------------------------------------------ */
+* ------------------------------------------------------------------------ */
/**
* \brief Short description in one line
- *
- * Long description which
+ *
+ * Long description which
* can span multiple lines
*/
/**
- * \file
+ * \file
* \brief Pattern for the definition of a new type of Node (header)
*/
/**
- * \class bbtk::NodePatern
- * \brief Pattern for the definition of a new type of Node
+ * \class bbtk::NodePatern
+ * \brief Pattern for the definition of a new type of Node
*/
#ifdef _USE_VTK_
namespace bbvtk
{
- class bbvtk_EXPORT MIPCreator : public bbtk::AtomicBlackBox
- {
+ class bbvtk_EXPORT MIPCreator : public bbtk::AtomicBlackBox
+ {
public:
BBTK_BLACK_BOX_INTERFACE(MIPCreator,bbtk::AtomicBlackBox);
// BBTK_DECLARE_INPUT(Contour,int);
BBTK_DECLARE_INPUT(In,vtkImageData *);
- BBTK_DECLARE_INPUT(Shift,int);
- BBTK_DECLARE_INPUT(Scale,float);
+ BBTK_DECLARE_INPUT(DensityPoints, std::vector<double> );
+ BBTK_DECLARE_INPUT(OpacityValues, std::vector<double> );
+ BBTK_DECLARE_INPUT(MinColorWindow, double );
+ BBTK_DECLARE_INPUT(MaxColorWindow, double );
BBTK_DECLARE_OUTPUT(Out,vtkProp3D*);
BBTK_PROCESS(Process);
void Process();
-
+
protected:
private:
+ std::vector<double> DensityPoints;
+ std::vector<double> OpacityValues;
vtkImageShiftScale *mCast;
vtkVolumeRayCastMIPFunction *mMIP;
vtkVolumeRayCastMapper *mMapper;
vtkVolume *mVolume;
+ vtkPiecewiseFunction *opacityTransferFunction;
+ vtkPiecewiseFunction *grayTransferFunction;
+ double scale;
};
-
+
//=================================================================
// UserBlackBox description
BBTK_BEGIN_DESCRIBE_BLACK_BOX(MIPCreator,bbtk::AtomicBlackBox);
BBTK_AUTHOR("laurent.guigues@creatis.insa-lyon.fr");
BBTK_DESCRIPTION("Creates a Maximum Intensity Projection (MIP) view of a 3D image. Creates a vtkProp3D object to insert into a 3D scene (e.g. a Viewer3D)");
BBTK_CATEGORY("3D object creator");
- BBTK_INPUT(MIPCreator,Shift,"Gray scale shift",int,"");
- BBTK_INPUT(MIPCreator,Scale,"Gray scale scaling",float,"");
+ BBTK_INPUT(MIPCreator,DensityPoints,"Density values of the original image", std::vector<double>,"");
+ BBTK_INPUT(MIPCreator,OpacityValues,"Opacity values for the MIP function", std::vector<double>,"");
BBTK_INPUT(MIPCreator,In,"Input Image",vtkImageData *,"");
+ BBTK_INPUT(MIPCreator,MinColorWindow,"Minimum density value for MIP color function", double,"");
+ BBTK_INPUT(MIPCreator,MaxColorWindow,"Maximum density value for MIP color function", double,"");
BBTK_OUTPUT(MIPCreator,Out,"MIP object to plug into a 3D viewer",vtkProp3D*,"");
BBTK_END_DESCRIBE_BLACK_BOX(MIPCreator);
//=================================================================