[Insight-users] combining output from segmentation with label map attributes using Gaetan Lehmann's paper: "Label object representation and manipulation with ITK"
Luis Ibanez
luis.ibanez at kitware.com
Fri Dec 11 11:30:08 EST 2009
Hi John,
What do you mean by "antiquated" ?
Are you grabbing that code from an old release ?
The Relabel filter has not been declared deprecated
and it is still a functional part of the toolkit.
You may also be interested in the filter that we
recently moved into the Code/Review directory:
itkLabelGeometryImageFilter.h
that is described in the Insight Journal paper:
"A Label Geometry Image Filter for Multiple Object Measurement"
by Padfield D., Miller J. from GE Global Research
http://www.insight-journal.org/browse/publication/301
http://hdl.handle.net/1926/1493
----
About your comparison with Slicer3,
How did you created the label map inside Slicer ?
Did you uploaded the same binary image that was
generated from your code ?
Apparently,
we are discussing here a difference of: 1 pixel
Please let us know
Luis
-----------------------------------------------------------------------------
On Tue, Dec 8, 2009 at 5:30 PM, John Drozd <john.drozd at gmail.com> wrote:
> Hi again,
>
> I reverted to using an antiquated "RelabelComponentImageFilter.h" header to
> get the volume of the ventricles, but is there a way to get the physical
> size using a non-antiquated currently used header?
>
> I used:
>
> //ADDED PER WEB PAGE
>
> //http://old.nabble.com/Labeling-an-image-and-displaying-results-with-distinguished-levels-of-gray-colors-td26623991.html
> typedef itk::ConnectedComponentImageFilter <OutputImageType,
> OutputImageType> LabelType2;
> typedef itk::RelabelComponentImageFilter <OutputImageType,
> OutputImageType> RelabelType;
>
> LabelType2::Pointer labeler = LabelType2::New();
> RelabelType::Pointer relabeler = RelabelType::New();
>
> labeler->SetInput(caster->GetOutput());
> labeler->Update();
>
> relabeler->SetInput(labeler->GetOutput());
> relabeler->Update();
>
> for (unsigned int i=0; i<relabeler->GetNumberOfObjects(); i++)
> {
> std::cout<<"Number of pixel for object "<<i<<":
> "<<relabeler->GetSizeOfObjectsInPixels()[i]<<std::endl;
>
> std::cout<<"Physical size for object "<<i<<":
> "<<relabeler->GetSizeOfObjectsInPhysicalUnits()[i]<<std::endl;
> }
> //END OF ADDED CODE
>
> This gave me a ventricle size of
> Number of pixel for object 0: 22129
> Physical size for object 0: 23901
>
> When I created a label map using the gui in 3DSlicer, I got a similar size
> but not exactly the same size:
> Number of pixel for object 0: 22130
> Physical size for object 0: 23901.284681
>
> Below is the updated code:
>
> /*
> to run type:
> ./ConnectedThresholdImageFilter correctedsubject5.dcm outsubject5.dcm 103
> 142 95 17100 17300
> */
>
> #if defined(_MSC_VER)
> #pragma warning ( disable : 4786 )
> #endif
>
> #ifdef __BORLANDC__
> #define ITK_LEAN_AND_MEAN
> #endif
>
>
> #include "itkConnectedThresholdImageFilter.h"
>
> #include "itkImage.h"
> #include "itkCastImageFilter.h"
>
> #include "itkCurvatureFlowImageFilter.h"
>
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
>
> #include "itkGDCMImageIO.h"
>
> #include "itkVersion.h"
>
> #include "itkOrientedImage.h"
> #include "itkMinimumMaximumImageFilter.h"
>
> #include "itkGDCMImageIO.h"
> #include "itkGDCMSeriesFileNames.h"
> #include "itkNumericSeriesFileNames.h"
>
> #include "itkImageSeriesReader.h"
> #include "itkImageSeriesWriter.h"
>
> #include "itkResampleImageFilter.h"
> #include "itkShiftScaleImageFilter.h"
>
> #include "itkIdentityTransform.h"
> #include "itkLinearInterpolateImageFunction.h"
>
> #include <itksys/SystemTools.hxx>
>
> #include "gdcm/src/gdcmFile.h"
> #include "gdcm/src/gdcmUtil.h"
>
> #include <string>
>
> //added per attribute_values.cxx
> #include "itkImageFileReader.h"
>
> #include "itkShapeLabelObject.h"
> //#include "itkStatisticsLabelObject.h"
>
> #include "itkLabelMap.h"
>
> #include "itkBinaryImageToShapeLabelMapFilter.h"
> //#include "itkBinaryImageToStatisticsLabelMapFilter.h"
>
> //ADDED PER WEB PAGE
> //http://old.nabble.com/Labeling-an-image-and-displaying-results-with-distinguished-levels-of-gray-colors-td26623991.html
> #include "itkConnectedComponentImageFilter.h"
> #include "itkRelabelComponentImageFilter.h"
> //END OF ADDED CODE
>
> //end of added code
>
> int main( int argc, char *argv[])
> {
> if( argc < 7 )
> {
> std::cerr << "Missing Parameters " << std::endl;
> std::cerr << "Usage: " << argv[0];
> std::cerr << " inputImage outputImage seedX seedY seedZ lowerThreshold
> upperThreshold" << std::endl;
>
> return 1;
> }
>
> typedef float InternalPixelType;
>
> const unsigned int Dimension = 3;
>
> typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
>
> typedef signed short OutputPixelType;
>
> typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
> typedef itk::Image< float, Dimension > OutputImageType2;
> typedef itk::CastImageFilter< InternalImageType, OutputImageType >
> CastingFilterType;
> CastingFilterType::Pointer caster = CastingFilterType::New();
>
> const unsigned int ImageDimension = 3;
> typedef signed short PixelType;
>
> typedef itk::Image< PixelType, ImageDimension > FixedImageType;
> typedef itk::Image< float, ImageDimension > FloatImageType;
>
> typedef itk::ImageFileReader< FixedImageType > ReaderType;
> typedef itk::ImageFileWriter< OutputImageType > WriterType;
> typedef itk::ImageFileWriter< FloatImageType > WriterType2;
>
> ReaderType::Pointer reader = ReaderType::New();
> WriterType::Pointer writer = WriterType::New();
> WriterType2::Pointer writer2 = WriterType2::New();
>
> typedef itk::GDCMImageIO ImageIOTypefixed;
> ImageIOTypefixed::Pointer gdcmImageIOfixed = ImageIOTypefixed::New();
> reader->SetImageIO( gdcmImageIOfixed );
>
> typedef itk::GDCMImageIO ImageIOTypefixed2;
> ImageIOTypefixed2::Pointer gdcmImageIOfixed2 = ImageIOTypefixed2::New();
>
> reader->SetFileName( argv[1] );
>
> reader->Update();
>
> typedef itk::CurvatureFlowImageFilter< InternalImageType,
> InternalImageType >
> CurvatureFlowImageFilterType;
>
> CurvatureFlowImageFilterType::Pointer smoothing =
> CurvatureFlowImageFilterType::New();
>
> typedef itk::ConnectedThresholdImageFilter< InternalImageType,
> InternalImageType > ConnectedFilterType;
>
> ConnectedFilterType::Pointer connectedThreshold =
> ConnectedFilterType::New();
>
> typedef signed short InputAPixelType;
> typedef float OutputBPixelType;
>
> typedef itk::Image< InputAPixelType, 3 > InputAImageType;
> typedef itk::Image< OutputBPixelType, 3 > OutputBImageType;
>
> typedef itk::CastImageFilter< InputAImageType, OutputBImageType >
> CastFilterType;
>
> CastFilterType::Pointer castFilter = CastFilterType::New();
>
>
> castFilter->SetInput( reader->GetOutput() );
>
>
> connectedThreshold->SetInput( castFilter->GetOutput() );
>
> caster->SetInput( connectedThreshold->GetOutput() );
>
>
> smoothing->SetNumberOfIterations( 20 ); //was 5
> smoothing->SetTimeStep( 0.125 );
>
> const InternalPixelType lowerThreshold = atof( argv[6] );
> const InternalPixelType upperThreshold = atof( argv[7] );
>
> connectedThreshold->SetLower( lowerThreshold );
> connectedThreshold->SetUpper( upperThreshold );
>
> connectedThreshold->SetReplaceValue( 255 );
>
> InternalImageType::IndexType index;
>
> index[0] = atoi( argv[3] );
> index[1] = atoi( argv[4] );
>
> //added
> index[2] = atoi( argv[5] );
>
> std::cout << index << std::endl;
>
> // Software Guide : BeginCodeSnippet
> connectedThreshold->SetSeed( index );
>
> //obtain a 5 x 5 bounding region of seeds
> int ii, jj, kk;
>
> ii = index[0];
> jj = index[1];
> kk = index[2];
>
> for (int i = ii; i < ii + 5; i++)
> for (int j = jj; j < jj + 5; j++)
> for (int k = kk; k < kk + 5; k++)
> {
>
> index[0] = i;
> index[1] = j;
> index[2] = k;
> connectedThreshold->AddSeed( index );
> }
>
> for (int i = ii; i > ii - 5; i--)
> for (int j = jj; j > jj - 5; j--)
> for (int k = kk; k > kk - 5; k--)
> {
>
> index[0] = i;
> index[1] = j;
> index[2] = k;
> connectedThreshold->AddSeed( index );
> }
>
> connectedThreshold->Print(std::cout,17100);
>
> typedef itk::MetaDataDictionary DictionaryType;
>
> DictionaryType inputdict = reader->GetMetaDataDictionary();
>
> writer->SetMetaDataDictionary( inputdict );
>
> writer->SetFileName( argv[2] );
>
> //added per attribute_values.cxx
>
> // define the object type. Here the ShapeLabelObject type
> // is chosen in order to read some attribute related to the shape
> // of the objects (by opposition to the content of the object, with
> // the StatisticsLabelObejct).
> typedef unsigned long LabelType;
>
> typedef itk::ShapeLabelObject< LabelType, 3 > LabelObjectType;
>
> typedef itk::LabelMap< LabelObjectType > LabelMapType;
>
> // convert the image in a collection of objects
> typedef itk::BinaryImageToLabelMapFilter< OutputImageType, LabelMapType >
> ConverterType;
>
> ConverterType::Pointer converter = ConverterType::New();
>
> //ADDED after email
> connectedThreshold->Update();
> //END OF ADDED code
>
> //ADDED PER WEB PAGE
>
> //http://old.nabble.com/Labeling-an-image-and-displaying-results-with-distinguished-levels-of-gray-colors-td26623991.html
> typedef itk::ConnectedComponentImageFilter <OutputImageType,
> OutputImageType> LabelType2;
> typedef itk::RelabelComponentImageFilter <OutputImageType,
> OutputImageType> RelabelType;
>
> LabelType2::Pointer labeler = LabelType2::New();
> RelabelType::Pointer relabeler = RelabelType::New();
>
> labeler->SetInput(caster->GetOutput());
> labeler->Update();
>
> relabeler->SetInput(labeler->GetOutput());
> relabeler->Update();
>
> for (unsigned int i=0; i<relabeler->GetNumberOfObjects(); i++)
> {
> std::cout<<"Number of pixel for object "<<i<<":
> "<<relabeler->GetSizeOfObjectsInPixels()[i]<<std::endl;
>
> std::cout<<"Physical size for object "<<i<<":
> "<<relabeler->GetSizeOfObjectsInPhysicalUnits()[i]<<std::endl;
> }
> //END OF ADDED CODE
>
> //converter->SetInput( connectedThreshold->GetOutput() );
> converter->SetInput( relabeler->GetOutput() );
>
> //converter->SetForegroundValue( atoi(argv[2]) );
> //converter->SetForegroundValue( 255 );
>
> // valuate the attributes with the dedicated filter: ShapeLabelMapFilter
>
> typedef itk::ShapeLabelMapFilter< LabelMapType > ShapeFilterType;
> ShapeFilterType::Pointer shape = ShapeFilterType::New();
> shape->SetInput( converter->GetOutput() );
>
> shape->Update();
>
>
> // then we can read the attribute values we're interested in. The
> BinaryImageToShapeLabelMapFilter
> // produce consecutive labels, so we can use a for loop and
> GetLabelObject() method to retrieve
> // the label objects. If the labels are not consecutive, the
> GetNthLabelObject() method must be
> // use instead of GetLabelObject(), or an iterator on the label object
> container of the label map.
> LabelMapType::Pointer labelMap = shape->GetOutput();
>
> std::cout << "Number of label objects = " <<
> labelMap->GetNumberOfLabelObjects() << std::endl;
>
>
> for( unsigned int label=1; label<=labelMap->GetNumberOfLabelObjects();
> label++ )
> {
> // we don't need a SmartPointer of the label object here, because the
> reference is kept in
> // in the label map.
> const LabelObjectType * labelObject = labelMap->GetLabelObject( label );
> std::cout << label << "\t" << labelObject->GetPhysicalSize() << "\t" <<
> labelObject->GetCentroid() << std::endl;
> }
>
> writer->SetInput( caster->GetOutput() );
>
> try
> {
> writer->Update();
> }
> catch( itk::ExceptionObject & excep )
> {
> std::cerr << "Exception caught !" << std::endl;
> std::cerr << excep << std::endl;
> }
>
> std::cout << "output from reader->GetOutput()->GetDirection()" <<
> std::endl;
> std::cout << reader->GetOutput()->GetDirection() << std::endl;
>
> std::cout << "output from castFilter->GetOutput()->GetDirection()" <<
> std::endl;
> std::cout << castFilter->GetOutput()->GetDirection() << std::endl;
>
> std::cout << "output from connectedThreshold->GetOutput()->GetDirection()"
> << std::endl;
> std::cout << connectedThreshold->GetOutput()->GetDirection() << std::endl;
>
> std::cout << "output from caster->GetOutput()->GetDirection()" <<
> std::endl;
> std::cout << caster->GetOutput()->GetDirection() << std::endl;
>
> return 0;
> }
>
> and output:
> [jdrozd at trumpet
> ConnectedThresholdImageFilter_and_BinaryImageToStatisticsLabelMapFilter]$
> make
> Scanning dependencies of target
> ConnectedThresholdImageFilter
> [100%] Building CXX object
> CMakeFiles/ConnectedThresholdImageFilter.dir/ConnectedThresholdImageFilter.o
> In file included from
> /usr/lib/gcc/x86_64-redhat-linux/4.3.2/../../../../include/c++/4.3.2/ext/hash_map:64,
> from
> /trumpet/downloads/3DSlicerDec22009/Slicer3-lib/Insight/Code/Common/itk_hash_map.h:69,
> from
> /trumpet/downloads/3DSlicerDec22009/Slicer3-lib/Insight/Code/BasicFilters/itkRelabelComponentImageFilter.txx:25,
> from
> /trumpet/downloads/3DSlicerDec22009/Slicer3-lib/Insight/Code/BasicFilters/itkRelabelComponentImageFilter.h:298,
> from
> /trumpet/downloads/ConnectedThresholdImageFilter_and_BinaryImageToStatisticsLabelMapFilter_Plugin/ConnectedThresholdImageFilter_and_BinaryImageToStatisticsLabelMapFilter/ConnectedThresholdImageFilter.cxx:65:
> /usr/lib/gcc/x86_64-redhat-linux/4.3.2/../../../../include/c++/4.3.2/backward/backward_warning.h:33:2:
> warning: #warning This file includes at least one deprecated or antiquated
> header which may be removed without further notice at a future date. Please
> use a non-deprecated interface with equivalent functionality instead. For a
> listing of replacement headers and interfaces, consult the file
> backward_warning.h. To disable this warning use -Wno-deprecated.
> Linking CXX executable
> ConnectedThresholdImageFilter
> [100%] Built target
> ConnectedThresholdImageFilter
> [jdrozd at trumpet
> ConnectedThresholdImageFilter_and_BinaryImageToStatisticsLabelMapFilter]$
> ./ConnectedThresholdImageFilter correctedsubject5.dcm outsubject5.dcm 103
> 142 95 17100
> 17300
> [103, 142,
> 95]
> ��H��H�}�H�U�H��9(ConnectedThresholdImageFilter
> (0xe37580)
> RTTI typeinfo:
> itk::ConnectedThresholdImageFilter<itk::Image<float, 3u>, itk::Image<float,
> 3u> >
> Reference Count:
> 1
> Modified Time:
> 376
> Debug:
> Off
>
> Observers:
>
> none
> Number Of Required Inputs:
> 1
> Number Of Required Outputs:
> 1
> Number Of Threads:
> 8
> ReleaseDataFlag:
> Off
> ReleaseDataBeforeUpdateFlag:
> Off
> Input 0:
> (0xe49e50)
> Input 1:
> (0xe399b0)
> Input 2:
> (0xe37980)
> Output 0:
> (0xe376a0)
> AbortGenerateData:
> Off
> Progress:
> 0
>
> Multithreader:
> RTTI typeinfo:
> itk::MultiThreader
> Reference Count:
> 1
> Modified Time:
> 82
> Debug:
> Off
>
> Observers:
>
> none
> Thread Count: 8
> Global Maximum Number Of Threads:
> 128
> Global Default Number Of Threads: 8
> Upper: 3.40282e+38
> Lower: -3.40282e+38
> ReplaceValue: 255
> Connectivity: 0
> Number of pixel for object 0: 22129
> Physical size for object 0: 23901
> Number of pixel for object 1: 1
> Physical size for object 1: 1.08004
> Number of label objects = 0
> output from reader->GetOutput()->GetDirection()
> 0 0 1
> 0 1 0
> -1 0 0
>
> output from castFilter->GetOutput()->GetDirection()
> 0 0 1
> 0 1 0
> -1 0 0
>
> output from connectedThreshold->GetOutput()->GetDirection()
> 0 0 1
> 0 1 0
> -1 0 0
>
> output from caster->GetOutput()->GetDirection()
> 0 0 1
> 0 1 0
> -1 0 0
>
> [jdrozd at trumpet
> ConnectedThresholdImageFilter_and_BinaryImageToStatisticsLabelMapFilter]$
>
>
>
> On Tue, Dec 8, 2009 at 2:38 PM, John Drozd <john.drozd at gmail.com> wrote:
>>
>> Hello,
>>
>> I have segmented the ventricles from an image using a connected threshold
>> image filter.
>> I then tried to convert my outputted segmentation to a label map filter
>> and then to get the label's attributes.
>>
>> I am using parts of the example code attribute_values.cxx that is
>> described in section 9.4 of
>> Gaetan Lehmann's paper: "Label object representation and manipulation with
>> ITK"
>>
>> My problem is that my code is telling me that the number of labels is 0.
>> How do I apply a label to my segmented ventricles?
>>
>> Below is my code:
>>
>> /*
>> to run type:
>> ./ConnectedThresholdImageFilter correctedsubject5.dcm outsubject5.dcm 103
>> 142 95 17100 17300
>> */
>>
>> #if defined(_MSC_VER)
>> #pragma warning ( disable : 4786 )
>> #endif
>>
>> #ifdef __BORLANDC__
>> #define ITK_LEAN_AND_MEAN
>> #endif
>>
>>
>> #include "itkConnectedThresholdImageFilter.h"
>>
>> #include "itkImage.h"
>> #include "itkCastImageFilter.h"
>>
>> #include "itkCurvatureFlowImageFilter.h"
>>
>> #include "itkImageFileReader.h"
>> #include "itkImageFileWriter.h"
>>
>> #include "itkGDCMImageIO.h"
>>
>> #include "itkVersion.h"
>>
>> #include "itkOrientedImage.h"
>> #include "itkMinimumMaximumImageFilter.h"
>>
>> #include "itkGDCMImageIO.h"
>> #include "itkGDCMSeriesFileNames.h"
>> #include "itkNumericSeriesFileNames.h"
>>
>> #include "itkImageSeriesReader.h"
>> #include "itkImageSeriesWriter.h"
>>
>> #include "itkResampleImageFilter.h"
>> #include "itkShiftScaleImageFilter.h"
>>
>> #include "itkIdentityTransform.h"
>> #include "itkLinearInterpolateImageFunction.h"
>>
>> #include <itksys/SystemTools.hxx>
>>
>> #include "gdcm/src/gdcmFile.h"
>> #include "gdcm/src/gdcmUtil.h"
>>
>> #include <string>
>>
>> //added per attribute_values.cxx
>> #include "itkImageFileReader.h"
>>
>> #include "itkShapeLabelObject.h"
>> //#include "itkStatisticsLabelObject.h"
>>
>> #include "itkLabelMap.h"
>>
>> #include "itkBinaryImageToShapeLabelMapFilter.h"
>> //#include "itkBinaryImageToStatisticsLabelMapFilter.h"
>>
>> //end of added code
>>
>> int main( int argc, char *argv[])
>> {
>> if( argc < 7 )
>> {
>> std::cerr << "Missing Parameters " << std::endl;
>> std::cerr << "Usage: " << argv[0];
>> std::cerr << " inputImage outputImage seedX seedY seedZ
>> lowerThreshold upperThreshold" << std::endl;
>>
>> return 1;
>> }
>>
>> typedef float InternalPixelType;
>>
>> const unsigned int Dimension = 3;
>>
>> typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
>>
>> typedef signed short OutputPixelType;
>>
>> typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
>> typedef itk::Image< float, Dimension > OutputImageType2;
>> typedef itk::CastImageFilter< InternalImageType, OutputImageType >
>> CastingFilterType;
>> CastingFilterType::Pointer caster = CastingFilterType::New();
>>
>> const unsigned int ImageDimension = 3;
>> typedef signed short PixelType;
>>
>> typedef itk::Image< PixelType, ImageDimension > FixedImageType;
>> typedef itk::Image< float, ImageDimension > FloatImageType;
>>
>> typedef itk::ImageFileReader< FixedImageType > ReaderType;
>> typedef itk::ImageFileWriter< OutputImageType > WriterType;
>> typedef itk::ImageFileWriter< FloatImageType > WriterType2;
>>
>> ReaderType::Pointer reader = ReaderType::New();
>> WriterType::Pointer writer = WriterType::New();
>> WriterType2::Pointer writer2 = WriterType2::New();
>>
>> typedef itk::GDCMImageIO ImageIOTypefixed;
>> ImageIOTypefixed::Pointer gdcmImageIOfixed = ImageIOTypefixed::New();
>> reader->SetImageIO( gdcmImageIOfixed );
>>
>> typedef itk::GDCMImageIO ImageIOTypefixed2;
>> ImageIOTypefixed2::Pointer gdcmImageIOfixed2 = ImageIOTypefixed2::New();
>>
>> reader->SetFileName( argv[1] );
>>
>> reader->Update();
>>
>> typedef itk::CurvatureFlowImageFilter< InternalImageType,
>> InternalImageType >
>> CurvatureFlowImageFilterType;
>>
>> CurvatureFlowImageFilterType::Pointer smoothing =
>> CurvatureFlowImageFilterType::New();
>>
>> typedef itk::ConnectedThresholdImageFilter< InternalImageType,
>> InternalImageType >
>> ConnectedFilterType;
>>
>> ConnectedFilterType::Pointer connectedThreshold =
>> ConnectedFilterType::New();
>>
>> typedef signed short InputAPixelType;
>> typedef float OutputBPixelType;
>>
>> typedef itk::Image< InputAPixelType, 3 > InputAImageType;
>> typedef itk::Image< OutputBPixelType, 3 > OutputBImageType;
>>
>> typedef itk::CastImageFilter< InputAImageType, OutputBImageType >
>> CastFilterType;
>>
>> CastFilterType::Pointer castFilter = CastFilterType::New();
>>
>>
>> castFilter->SetInput( reader->GetOutput() );
>>
>>
>> connectedThreshold->SetInput( castFilter->GetOutput() );
>>
>> caster->SetInput( connectedThreshold->GetOutput() );
>>
>>
>> smoothing->SetNumberOfIterations( 20 ); //was 5
>> smoothing->SetTimeStep( 0.125 );
>>
>> const InternalPixelType lowerThreshold = atof( argv[6] );
>> const InternalPixelType upperThreshold = atof( argv[7] );
>>
>> connectedThreshold->SetLower( lowerThreshold );
>> connectedThreshold->SetUpper( upperThreshold );
>>
>> connectedThreshold->SetReplaceValue( 255 );
>>
>> InternalImageType::IndexType index;
>>
>> index[0] = atoi( argv[3] );
>> index[1] = atoi( argv[4] );
>>
>> //added
>> index[2] = atoi( argv[5] );
>>
>> std::cout << index << std::endl;
>>
>> // Software Guide : BeginCodeSnippet
>> connectedThreshold->SetSeed( index );
>>
>> //obtain a 5 x 5 bounding region of seeds
>> int ii, jj, kk;
>>
>> ii = index[0];
>> jj = index[1];
>> kk = index[2];
>>
>> for (int i = ii; i < ii + 5; i++)
>> for (int j = jj; j < jj + 5; j++)
>> for (int k = kk; k < kk + 5; k++)
>> {
>>
>> index[0] = i;
>> index[1] = j;
>> index[2] = k;
>> connectedThreshold->AddSeed( index );
>> }
>>
>> for (int i = ii; i > ii - 5; i--)
>> for (int j = jj; j > jj - 5; j--)
>> for (int k = kk; k > kk - 5; k--)
>> {
>>
>> index[0] = i;
>> index[1] = j;
>> index[2] = k;
>> connectedThreshold->AddSeed( index );
>> }
>>
>> connectedThreshold->Print(std::cout,17100);
>>
>> typedef itk::MetaDataDictionary DictionaryType;
>>
>> DictionaryType inputdict = reader->GetMetaDataDictionary();
>>
>> writer->SetMetaDataDictionary( inputdict );
>>
>> writer->SetFileName( argv[2] );
>>
>> //added per attribute_values.cxx
>>
>> // define the object type. Here the ShapeLabelObject type
>> // is chosen in order to read some attribute related to the shape
>> // of the objects (by opposition to the content of the object, with
>> // the StatisticsLabelObejct).
>> typedef unsigned long LabelType;
>>
>> typedef itk::ShapeLabelObject< LabelType, 3 > LabelObjectType;
>>
>> typedef itk::LabelMap< LabelObjectType > LabelMapType;
>>
>> // convert the image in a collection of objects
>> typedef itk::BinaryImageToLabelMapFilter< InternalImageType,
>> LabelMapType > ConverterType;
>>
>> ConverterType::Pointer converter = ConverterType::New();
>>
>> converter->SetInput( connectedThreshold->GetOutput() );
>>
>> //converter->SetForegroundValue( atoi(argv[2]) );
>> //converter->SetForegroundValue( 255 );
>>
>> // valuate the attributes with the dedicated filter: ShapeLabelMapFilter
>>
>> typedef itk::ShapeLabelMapFilter< LabelMapType > ShapeFilterType;
>> ShapeFilterType::Pointer shape = ShapeFilterType::New();
>> shape->SetInput( converter->GetOutput() );
>>
>> shape->Update();
>>
>>
>> // then we can read the attribute values we're interested in. The
>> BinaryImageToShapeLabelMapFilter
>> // produce consecutive labels, so we can use a for loop and
>> GetLabelObject() method to retrieve
>> // the label objects. If the labels are not consecutive, the
>> GetNthLabelObject() method must be
>> // use instead of GetLabelObject(), or an iterator on the label object
>> container of the label map.
>> LabelMapType::Pointer labelMap = shape->GetOutput();
>>
>> std::cout << "Number of label objects = " <<
>> labelMap->GetNumberOfLabelObjects() << std::endl;
>>
>>
>> for( unsigned int label=1; label<=labelMap->GetNumberOfLabelObjects();
>> label++ )
>> {
>> // we don't need a SmartPointer of the label object here, because the
>> reference is kept in
>> // in the label map.
>> const LabelObjectType * labelObject = labelMap->GetLabelObject( label
>> );
>> std::cout << label << "\t" << labelObject->GetPhysicalSize() << "\t"
>> << labelObject->GetCentroid() << std::endl;
>> }
>>
>> writer->SetInput( caster->GetOutput() );
>>
>> try
>> {
>> writer->Update();
>> }
>> catch( itk::ExceptionObject & excep )
>> {
>> std::cerr << "Exception caught !" << std::endl;
>> std::cerr << excep << std::endl;
>> }
>>
>> std::cout << "output from reader->GetOutput()->GetDirection()" <<
>> std::endl;
>> std::cout << reader->GetOutput()->GetDirection() << std::endl;
>>
>> std::cout << "output from castFilter->GetOutput()->GetDirection()" <<
>> std::endl;
>> std::cout << castFilter->GetOutput()->GetDirection() << std::endl;
>>
>> std::cout << "output from
>> connectedThreshold->GetOutput()->GetDirection()" << std::endl;
>> std::cout << connectedThreshold->GetOutput()->GetDirection() <<
>> std::endl;
>>
>> std::cout << "output from caster->GetOutput()->GetDirection()" <<
>> std::endl;
>> std::cout << caster->GetOutput()->GetDirection() << std::endl;
>>
>> return 0;
>> }
>>
>
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
>
More information about the Insight-users
mailing list