|
|
Line 1: |
Line 1: |
| ==ImageFilterMultipleOutputs.cxx==
| | {{warning|1=The media wiki content on this page is no longer maintained. The examples presented on the https://itk.org/Wiki/* pages likely require ITK version 4.13 or earlier releases. In many cases, the examples on this page no longer conform to the best practices for modern ITK versions.}} |
| <source lang="cpp">
| |
| #include "itkImage.h"
| |
| #include "itkImageFileReader.h"
| |
| #include "itkImageFileWriter.h"
| |
| | |
| #include "ImageFilterMultipleOutputs.h"
| |
| | |
| int main(int, char*[])
| |
| { | |
| // Setup types
| |
| typedef itk::Image<unsigned char, 2> ImageType;
| |
| typedef itk::ImageFilterMultipleOutputs<ImageType> FilterType;
| |
| | |
| // Create and the filter
| |
| FilterType::Pointer filter = FilterType::New();
| |
| filter->Update();
| |
| | |
| {
| |
| typedef itk::ImageFileWriter< ImageType > WriterType;
| |
| WriterType::Pointer writer = WriterType::New();
| |
| writer->SetFileName("TestOutput1.jpg");
| |
| writer->SetInput(filter->GetOutput1());
| |
| writer->Update();
| |
| }
| |
|
| |
| {
| |
| typedef itk::ImageFileWriter< ImageType > WriterType;
| |
| WriterType::Pointer writer = WriterType::New();
| |
| writer->SetFileName("TestOutput2.jpg");
| |
| writer->SetInput(filter->GetOutput2());
| |
| writer->Update();
| |
| }
| |
|
| |
| return EXIT_SUCCESS;
| |
| }
| |
| </source>
| |
| | |
| ==ImageFilterMultipleOutputs.h==
| |
| <source lang="cpp">
| |
| #ifndef __itkImageFilterMultipleOutputs_h
| |
| #define __itkImageFilterMultipleOutputs_h
| |
| | |
| #include "itkImageToImageFilter.h"
| |
| | |
| namespace itk
| |
| {
| |
| template< class TImage>
| |
| class ImageFilterMultipleOutputs : public ImageToImageFilter< TImage, TImage >
| |
| {
| |
| public:
| |
| /** Standard class typedefs. */
| |
| typedef ImageFilterMultipleOutputs Self;
| |
| typedef ImageToImageFilter< TImage, TImage > Superclass;
| |
| typedef SmartPointer< Self > Pointer;
| |
| | |
| /** Method for creation through the object factory. */
| |
| itkNewMacro(Self);
| |
| | |
| /** Run-time type information (and related methods). */
| |
| itkTypeMacro(ImageFilterMultipleOutputs, ImageToImageFilter); | |
| | |
| TImage* GetOutput1();
| |
| TImage* GetOutput2();
| |
|
| |
| protected:
| |
| ImageFilterMultipleOutputs();
| |
| ~ImageFilterMultipleOutputs(){}
| |
| | |
| /** Does the real work. */
| |
| virtual void GenerateData();
| |
| | |
| /** Create the Output */
| |
| DataObject::Pointer MakeOutput(unsigned int idx);
| |
| | |
| private:
| |
| ImageFilterMultipleOutputs(const Self &); //purposely not implemented
| |
| void operator=(const Self &); //purposely not implemented
| |
| | |
| };
| |
| } //namespace ITK
| |
| | |
| | |
| #ifndef ITK_MANUAL_INSTANTIATION
| |
| #include "ImageFilterMultipleOutputs.txx"
| |
| #endif
| |
| | |
| | |
| #endif // __itkImageFilterMultipleOutputs_h
| |
| </source>
| |
| | |
| ==ImageFilterMultipleOutputs.txx==
| |
| <source lang="cpp">
| |
| #ifndef __itkImageFilterMultipleOutputs_txx
| |
| #define __itkImageFilterMultipleOutputs_txx
| |
| | |
| #include "ImageFilterMultipleOutputs.h"
| |
| | |
| #include "itkObjectFactory.h"
| |
| #include "itkImageRegionIterator.h"
| |
| #include "itkImageRegionConstIterator.h"
| |
| | |
| namespace itk
| |
| {
| |
| | |
| template< class TImage>
| |
| ImageFilterMultipleOutputs<TImage>::ImageFilterMultipleOutputs()
| |
| {
| |
| this->SetNumberOfRequiredOutputs(2);
| |
| this->SetNumberOfRequiredInputs(0);
| |
| | |
| this->SetNthOutput( 0, this->MakeOutput(0) );
| |
| this->SetNthOutput( 1, this->MakeOutput(1) );
| |
| }
| |
| | |
| template< class TImage>
| |
| void ImageFilterMultipleOutputs<TImage>::GenerateData()
| |
| {
| |
| typename TImage::IndexType start;
| |
| start[0] = 0;
| |
| start[1] = 0;
| |
| | |
| typename TImage::SizeType size;
| |
| size[0] = 20;
| |
| size[1] = 20;
| |
| | |
| typename TImage::RegionType region;
| |
| region.SetSize(size);
| |
| region.SetIndex(start);
| |
|
| |
| // Setup output 1
| |
| typename TImage::Pointer output1 = this->GetOutput1();
| |
| output1->SetRegions(region);
| |
| output1->Allocate();
| |
|
| |
| itk::ImageRegionIterator<TImage> outputIterator1(output1, output1->GetLargestPossibleRegion());
| |
| outputIterator1.GoToBegin();
| |
|
| |
| while(!outputIterator1.IsAtEnd())
| |
| {
| |
| if(outputIterator1.GetIndex()[0] == outputIterator1.GetIndex()[1])
| |
| {
| |
| outputIterator1.Set(255);
| |
| }
| |
| else
| |
| {
| |
| outputIterator1.Set(0);
| |
| }
| |
| | |
| ++outputIterator1;
| |
| }
| |
| | |
| // Setup output 2
| |
| typename TImage::Pointer output2 = this->GetOutput2();
| |
| output2->SetRegions(region);
| |
| output2->Allocate();
| |
| | |
| itk::ImageRegionIterator<TImage> outputIterator2(output2, output2->GetLargestPossibleRegion());
| |
| outputIterator2.GoToBegin();
| |
| | |
| while(!outputIterator2.IsAtEnd())
| |
| {
| |
| if(outputIterator2.GetIndex()[0] > 10)
| |
| {
| |
| outputIterator2.Set(255);
| |
| }
| |
| else
| |
| {
| |
| outputIterator2.Set(0);
| |
| }
| |
| | |
| ++outputIterator2;
| |
| }
| |
| | |
| }
| |
| | |
| template< class TImage>
| |
| DataObject::Pointer ImageFilterMultipleOutputs<TImage>::MakeOutput(unsigned int idx)
| |
| {
| |
| DataObject::Pointer output;
| |
| | |
| switch ( idx )
| |
| {
| |
| case 0:
| |
| output = ( TImage::New() ).GetPointer();
| |
| break;
| |
| case 1:
| |
| output = ( TImage::New() ).GetPointer();
| |
| break;
| |
| default:
| |
| std::cerr << "No output " << idx << std::endl;
| |
| output = NULL;
| |
| break;
| |
| }
| |
| return output.GetPointer();
| |
| }
| |
| | |
| template< class TImage>
| |
| TImage* ImageFilterMultipleOutputs<TImage>::GetOutput1()
| |
| {
| |
| return dynamic_cast< TImage * >(
| |
| this->ProcessObject::GetOutput(0) );
| |
| }
| |
| | |
| template< class TImage>
| |
| TImage* ImageFilterMultipleOutputs<TImage>::GetOutput2()
| |
| {
| |
| return dynamic_cast< TImage * >(
| |
| this->ProcessObject::GetOutput(1) );
| |
| }
| |
| | |
| }// end namespace
| |
| | |
| | |
| #endif
| |
| </source>
| |
| | |
| {{ITKCMakeLists|{{SUBPAGENAME}}}}
| |