[Insight-developers] own ImageToImageFilter doesn't work
Bill Lorensen
bill.lorensen at gmail.com
Thu Aug 13 08:37:07 EDT 2009
You need to allocate the output for the filter.
In
::GenerateData
// Allocate the output
this->AllocateOutputs();
Bill
On Thu, Aug 13, 2009 at 5:48 AM, Michael
Siegesmund<TheSmashingPumpkin at web.de> wrote:
> Hi itk developers,
>
> I tried to write my own filter class (inherited from ImageToImageFilter), which encapsulates the functionality of ConnectedThresholdImageFilter.cxx from examples/segmentation.
> So I took CompositeFilterExample.cxx (from examples/filters) as a template and replaced the core code with the one of ConnectedThresholdImageFilter.cxx.
> Afterwards I figured out, that I can use my new class for filtering a png file (input=imageFileReader) but if I want to process a CT-image from a dicom reader (which works fine with other filters!) I always get a black screen.
> And it doesn't matter whether I use an imageviewer or a filewriter for output.
> The problem sounds like I forgot an important thing to do, for example initialize something. I tried hard, but couldn't find the bug.
>
> Do someone has an idea or a working example?
>
> Thanks in advance
>
>
>
> /////////////////////////////the header///////////////////////////////////
> #ifndef __ConnectedThresholdFilter_h
> #define __ConnectedThresholdFilter_h
>
> #ifdef _USE_ITK
>
>
> #include "itkImageToImageFilter.h"
> #include "itkCurvatureFlowImageFilter.h"
> #include "itkConnectedThresholdImageFilter.h"
> #include "itkCastImageFilter.h"
> #include "itkNumericTraits.h"
>
>
> namespace itk {
>
> template <class TImageType, class TOutputType>
> class ITK_EXPORT ConnectedThresholdFilter : public ImageToImageFilter<TImageType, TOutputType>
> {
> public:
>
> typedef ConnectedThresholdFilter Self;
> typedef ImageToImageFilter<TImageType,TOutputType> Superclass;
> typedef SmartPointer<Self> Pointer;
> typedef SmartPointer<const Self> ConstPointer;
>
> itkNewMacro(Self);
> itkTypeMacro(ConnectedThresholdFilter, ImageToImageFilter);
>
> void PrintSelf( std::ostream& os, Indent indent ) const;
>
> protected:
>
> ConnectedThresholdFilter();
>
> protected:
>
> typedef itk::Image< float, 3> FloatType;
>
> typedef itk::CurvatureFlowImageFilter< TImageType, FloatType > CurvatureFlowImageFilterType;
> typedef itk::ConnectedThresholdImageFilter< FloatType, FloatType > ConnectedFilterType;
> typedef itk::CastImageFilter< FloatType, TOutputType > CastingFilterType;
>
> void GenerateData();
>
> private:
>
> ConnectedThresholdFilter(Self&); // intentionally not implemented
> void operator=(const Self&); // intentionally not implemented
>
> typename CurvatureFlowImageFilterType::Pointer smoothing;
> typename ConnectedFilterType::Pointer connectedThreshold;
> typename CastingFilterType::Pointer caster;
>
> };
>
> } /* namespace itk */
>
> #ifndef ITK_MANUAL_INSTANTIATION
> #include "ConnectedThresholdFilter.cpp"
> #endif
>
> #endif _USE_ITK
>
> #endif
>
>
>
> //////////the class/////////////////////////////////////////
> #ifndef __ConnectedThresholdFilter_cpp
> #define __ConnectedThresholdFilter_cpp
>
> #ifdef _USE_ITK
>
> #include "ConnectedThresholdFilter.h"
>
>
> namespace itk
> {
>
> template <class TImageType, class TOutputType>
> ConnectedThresholdFilter<TImageType, TOutputType>::ConnectedThresholdFilter()
> {
> smoothing = CurvatureFlowImageFilterType::New();
> connectedThreshold = ConnectedFilterType::New();
> caster = CastingFilterType::New();
>
> connectedThreshold->SetInput( smoothing->GetOutput() );
> caster->SetInput( connectedThreshold->GetOutput() );
>
> smoothing->SetNumberOfIterations( 5 );
> smoothing->SetTimeStep( 0.125 );
>
> connectedThreshold->SetLower( 0 );
> connectedThreshold->SetUpper( 800 );
> connectedThreshold->SetReplaceValue( 255 );
>
> TImageType::IndexType index;
> index[0] = 250;
> index[1] = 250;
> connectedThreshold->SetSeed( index );
> }
>
> template <class TImageType, class TOutputType>
> void ConnectedThresholdFilter<TImageType, TOutputType>::GenerateData()
> {
> smoothing->SetInput(this->GetInput());
> caster->GraftOutput( this->GetOutput() );
> caster->Update();
> this->GraftOutput( caster->GetOutput() );
> }
>
>
> template <class TImageType, class TOutputType>
> void ConnectedThresholdFilter<TImageType, TOutputType>::PrintSelf( std::ostream& os, Indent indent ) const
> {
> Superclass::PrintSelf(os,indent);
> //not implemented yet
> }
>
> } /* end namespace itk */
>
>
> #endif _USE_ITK
>
> #endif
>
>
>
> ///////this is how i call it //////////////////////////
> typedef itk::Image<short, 3> ImageType;
> typedef itk::Image<unsigned char, 3> OutputType;
> typedef itk::ImageFileWriter<OutputType> WriterType;
> typedef itk::ConnectedThresholdFilter<ImageType,OutputType> FilterType1;
>
> WriterType::Pointer writer = WriterType::New();
> FilterType1::Pointer filter = FilterType1::New();
>
> //the input works!
> filter->SetInput(m_Dicomreader->GetITKOutput() );
> writer->SetInput( filter->GetOutput() );
> writer->SetFileName( "c://example.png" );
>
> try
> {
> writer->Update(); // so here I got a black image
> }
> catch ( itk::ExceptionObject e )
> {
> std::cerr << "Error: " << e << std::endl;
> }
>
> ______________________________________________________
> GRATIS für alle WEB.DE-Nutzer: Die maxdome Movie-FLAT!
> Jetzt freischalten unter http://movieflat.web.de
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.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-developers
>
More information about the Insight-developers
mailing list