[Insight-users] ConnectedThresholdImageFilter does take into accopunt the configuration

Daanen Vincent daanen at koelis.com
Tue Oct 13 09:16:24 EDT 2009


Well,

I could check that, as mentionned by Luis, the problem comes from my
conversion component i.e. if I use a itkImageReader to read the image, the
application does not crash, even if release :)
However, I can't figure out where is the bug in my component. I posted the
code below.
As one can see, I return the output of the itkImportimagefilter so, it
should be available for the rest of the pipeline but it seems that it's
invalidated at the exit of the static method Gmcao2Itk

May I miss something in SmartPointer ?

V


template <typename TYPE,size_t DIM> 
class CItkInterface
{
	typedef itk::ImportImageFilter< TYPE, DIM > TItkImportFilter;

public :
	typedef gmcao::CImage<TYPE,DIM>		TImage;
	typedef itk::Image<TYPE,DIM>			TItkImage;
	typedef CItkInterface<TYPE,DIM>		TItkInterface;

protected:
	CItkInterface()
	{	};

	virtual ~CItkInterface()
	{	};

public :
	/** Conversion */
	static typename TItkImage::Pointer Gmcao2Itk(const TImage &p_Image)
	{
		typedef TItkInterface::TItkImportFilter TItkImportFilter;
		TItkImportFilter::Pointer l_pImportFilter =
TItkImportFilter::New();
		if (l_pImportFilter.IsNull())	return
TItkImage::Pointer(NULL);

		// image Size
		{
			TItkImportFilter::SizeType l_ImgSize;
			{
				TImage::TIndex l_ImgWidths =
p_Image.GetWidths();
				l_ImgSize[0] = l_ImgWidths[0]; 
				l_ImgSize[1] = l_ImgWidths[1]; 
				l_ImgSize[2] = l_ImgWidths[2]; 
			}

			TItkImportFilter::IndexType l_RegionStart;
			l_RegionStart.Fill( 0 );

			TItkImportFilter::RegionType l_Region;
			l_Region.SetIndex( l_RegionStart );
			l_Region.SetSize( l_ImgSize );
			l_pImportFilter->SetRegion( l_Region );
		}

		// Image Origin
		{
			double l_ImgOrigin[DIM];
			l_ImgOrigin[0] =
p_Image.GetImage2Global().GetOrigin().X();
			l_ImgOrigin[1] =
p_Image.GetImage2Global().GetOrigin().Y(); 
			l_ImgOrigin[2] =
p_Image.GetImage2Global().GetOrigin().Z(); 
			l_pImportFilter->SetOrigin( l_ImgOrigin );
		}

		// image scale
		{
			CVector3D l_ImgScale;
			p_Image.GetImage2Global().GetScale(l_ImgScale);
			double l_Scale[DIM];
			l_Scale[0] = l_ImgScale.X();
			l_Scale[1] = l_ImgScale.Y();
			l_Scale[2] = l_ImgScale.Z();
			l_pImportFilter->SetSpacing( l_Scale );
		}

		// image direction
		{
			CAffineTransform3D l_T = p_Image.GetImage2Global();
			l_T.Normalize();

			TItkImage::DirectionType l_ImgDir;
			l_ImgDir(0,0) = l_T.GetI().X();
			l_ImgDir(1,0) = l_T.GetI().Y();
			l_ImgDir(2,0) = l_T.GetI().Z();

			l_ImgDir(0,1) = l_T.GetJ().X();
			l_ImgDir(1,1) = l_T.GetJ().Y();
			l_ImgDir(2,1) = l_T.GetJ().Z();

			l_ImgDir(0,2) = l_T.GetK().X();
			l_ImgDir(1,2) = l_T.GetK().Y();
			l_ImgDir(2,2) = l_T.GetK().Z();

			l_pImportFilter->SetDirection(l_ImgDir);
		}

		const bool l_bImportImageFilterWillOwnTheBuffer = false;
		TYPE *l_pDataBuff = (TYPE *)(p_Image.Begin());
		l_pImportFilter->SetImportPointer( l_pDataBuff,
p_Image.GetWidths().GetElementProduct(),l_bImportImageFilterWillOwnTheBuffer
);
		l_pImportFilter->Update();

		TItkImage::Pointer l_pItkImg = l_pImportFilter->GetOutput();
		return l_pItkImg;
	};
};


 

> -----Message d'origine-----
> De : Luis Ibanez [mailto:luis.ibanez at kitware.com] 
> Envoyé : lundi 12 octobre 2009 19:10
> À : Daanen Vincent
> Cc : insight-users at itk.org
> Objet : Re: [Insight-users] ConnectedThresholdImageFilter 
> does take into accopunt the configuration
> 
> Hi Vincent,
> 
> This is really bad    :-)
> 
> If you have code that works in Debug mode,
> but crashes in Release mode you probably have:
> 
>    A) Uninitialized variables
>    B) Dangling pointers
>    C) Out of bounds pointer access
>    D) An application build with inconsistent libraries
> 
> 
> None of those diseases are benign...
> 
> 
> BTW, I this the same application where you are using
> the /FORCE flag to get over some link warnings ?
> 
> If so, then, here are the dooming consequences of
> silencing the warnings that the linker was giving you.
> 
> It looks like there is more to this problem that
> you have shared with us   :-)
> 
> Please tell us about any compilation and linker
> warnings that you may have observed while
> building this application.
> 
> 
>     Thanks
> 
> 
>          Luis
> 
> 
> --------------------------------------------------------------
> -----------------
> On Mon, Oct 12, 2009 at 8:55 AM, Daanen Vincent 
> <daanen at koelis.com> wrote:
> > Hi All,
> >
> > I still have problems to use  the 
> itk::ConnectedThresholdImageFilter.
> >
> > Luis, I do not have any problem in Debug mode and although 
> the printed
> > values are not the ones I set in the  filter, it seems that 
> the process uses
> > the good ones to filter the image !!
> >
> > But, the same code still crashes in release mode in the 
> Update method...
> >
> > V
> >
> >
> >
> >> -----Message d'origine-----
> >> De : Luis Ibanez [mailto:luis.ibanez at kitware.com]
> >> Envoyé : jeudi 8 octobre 2009 15:43
> >> À : Daanen Vincent
> >> Cc : insight-users at itk.org
> >> Objet : Re: [Insight-users] ConnectedThresholdImageFilter
> >> does take into accopunt the configuration
> >>
> >> Hi Vincent,
> >>
> >> Thanks for the additional information.
> >>
> >> You made an interesting observation,
> >>
> >> It is very strange and suspicious that
> >> the values printed by filter->Print()
> >> do not correspond to the values of
> >> Lower/Upper/DebugOn and that you
> >> are setting.
> >>
> >> It looks like the filter is created in two
> >> separate places and we are looking at
> >> two different pieces of code.
> >>
> >> Any chance that you can run this in
> >> Debug mode ?
> >>
> >> It will be really helpful to locate the
> >> exact line where it is crashing (inside
> >> the Update() method call),  AND to
> >> look at the callstack to trace back
> >> what method call lead to that point.
> >>
> >>
> >>    Please let us know if you can do that,
> >>
> >>
> >>           Thanks
> >>
> >>
> >>                 Luis
> >>
> >>
> >> --------------------------------------------------------
> >> On Thu, Oct 8, 2009 at 9:32 AM, Daanen Vincent
> >> <daanen at koelis.com> wrote:
> >> > Hi Luis,
> >> >
> >> > Thanks for your input.
> >> >
> >> >> An easy way to verify this, would be to pass the image to
> >> >> an itkImageFileWriter<> and to save it to disk.
> >> >
> >> > I follow your requirement and thus, i could write my image
> >> on the disk ...I
> >> > checked the image and it is ok.
> >> >
> >> >> BTW: It is normal for the connected threshold filter not to
> >> >> offer the full connectivity option when ITK has been configured
> >> >> with REVIEW off. The reason is that this is a new feature, that
> >> >> relies on a new Iterator class that is currently in the 
> Code/Review
> >> >> directory.
> >> >
> >> > OK
> >> >
> >> >> In particular, you want to review the code of
> >> >>
> >> >>           TItkInterface::Gmcao2Itk(*l_pImg);
> >> >>
> >> >> and make sure that the ITK image produced by the ImportFilter
> >> >> is held ALL THE TIME by a SmartPointer.
> >> > Yes it is
> >> >
> >> >>
> >> >> Also, please double check the settings of the boolean flag that
> >> >> defines who will be responsible for releasing the memory of
> >> >> the imported image. (Wrongly setting this boolean is also
> >> >> a common mistake when importing images).
> >> >
> >> > The application is responsible for releasing the memory of
> >> >> the imported image and since I can write the imported
> >> image on the disk ,I
> >> > think it's ok.
> >> >
> >> > The crash occurs on the following line:
> >> > l_pFilter->Update();
> >> > So during the filter processing I guess ....
> >> >
> >> > Hereafter the output of the call to l_pFilter->Print() method:
> >> >
> >> > ConnectedThresholdImageFilter (003E7E48)
> >> >  RTTI typeinfo:   class itk::ConnectedThresholdImageFilter<class
> >> > itk::Image<unsigned char,3>,class itk::Image<unsigned char,3> >
> >> >  Reference Count: 1
> >> >  Modified Time: 53
> >> >  Debug: On
> >> >  Observers:none
> >> >  Number Of Required Inputs: 1
> >> >  Number Of Required Outputs: 1
> >> >  Number Of Threads: 2
> >> >  ReleaseDataFlag: Off
> >> >  ReleaseDataBeforeUpdateFlag: Off
> >> >  Input 0: (003EA538)
> >> >  Input 1: (003E81C8)
> >> >  Input 2: (003ECF80)
> >> >  Output 0: (003E7F28)
> >> >  AbortGenerateData: Off
> >> >  Progress: 0
> >> >  Multithreader:
> >> >    RTTI typeinfo:   class itk::MultiThreader
> >> >    Reference Count: 1
> >> >    Modified Time: 27
> >> >    Debug: Off
> >> >    Observers:
> >> >      none
> >> >    Thread Count: 2
> >> >    Global Maximum Number Of Threads: 128
> >> >    Global Default Number Of Threads: 2
> >> >  Upper: 255
> >> >  Lower: 0
> >> >  ReplaceValue: 1
> >> >  Connectivity: 0
> >> >
> >> > As you can see, Lower/Upper = [0 255] but I explicitly set
> >> them to 100/130
> >> > Debug is also OFF but I set it to on just before the call
> >> to Print ...
> >> >
> >> > Any Idea ?
> >> >
> >> > Vincent
> >> >>
> >> >>
> >> >>
> >> >>     Regards,
> >> >>
> >> >>
> >> >>           Luis
> >> >>
> >> >>
> >> >> ------------------
> >> >> On Wed, Oct 7, 2009 at 2:17 AM, Daanen Vincent
> >> >> <daanen at koelis.com> wrote:
> >> >> > Hi Itk users,
> >> >> >
> >> >> > I want to use itk::ConnectedThresholdImageFilter to extract
> >> >> a object from a
> >> >> > 3D image.
> >> >> > I first load the image and convert it from our own image
> >> >> format into itk
> >> >> > image format. The call to CItkInterface::Gmcao2Itk is just
> >> >> a wrapper to
> >> >> > ItkImageimportFilter.
> >> >> > I can say it is ok (I play several tests to check that all
> >> >> the data are
> >> >> > correctly converted...)
> >> >> >
> >> >> > I then instantiate a itk::ConnectedThresholdImageFilter
> >> >> ,set its input, the
> >> >> > thresholds and the seed. (My code is nearly the same that
> >> >> the one in the itk
> >> >> > user guide)
> >> >> >
> >> >> > When I call Update, the software crashes with messages in a
> >> >> window but I
> >> >> > can't read them totally ...:(
> >> >> >
> >> >> > So, before calling update, I print the component on screen
> >> >> (using Print
> >> >> > method) and I can see that the thresholds are not the one I
> >> >> set (low = 0;
> >> >> > high = 255) instead of (L/H = 100/130).
> >> >> > I also saw that there is not method to set the connectivity
> >> >> unless itk is
> >> >> > compiled with ITK_USE_REVIEW. Is this normal ? I can not
> >> see why the
> >> >> > connectivity is link to the REVIEW flag
> >> >> >
> >> >> > How can I find why the filter exit without making its work ?
> >> >> >
> >> >> > Thx for help
> >> >> >
> >> >> > Vince
> >> >> >
> >> >> > PS : the code I wrote. If someone sees something wrong,
> >> >> please tell me
> >> >> >
> >> >> > void Test()
> >> >> > {
> >> >> >
> >> >> > /// Our Own core work
> >> >> >        typedef gmcao::CImage<BYTE,3> TImage;
> >> >> >        CSmartPtr<TImage> l_pImg(new TImage);
> >> >> >
> >> >> >        if
> >> >> (!gmcao::CImageTools<TImage>::ReadImage(*l_pImg,"Img.hdr"))
> >> >> >        {
> >> >> >                std::cout<<"Could not read image"<<std::endl;
> >> >> >                return;
> >> >> >        }
> >> >> >
> >> >> >        typedef CItkInterface<TImage::TValue, TImage::Dim>
> >> >> TItkInterface;
> >> >> >        TItkInterface::TItkImage::Pointer l_pIktImg =
> >> >> > TItkInterface::Gmcao2Itk(*l_pImg);
> >> >> >        if (l_pIktImg.IsNull())
> >> >> >        {
> >> >> >                std::cout<<"Error converting Gmcao ->
> >> >> Itk"<<std::endl;
> >> >> >                return;
> >> >> >        }
> >> >> > ///
> >> >> >
> >> >> > /// Itk filter
> >> >> >        typedef
> >> >> >
> >> >> itk::ConnectedThresholdImageFilter<TItkInterface::TItkImage,TI
> >> >> tkInterface::T
> >> >> > ItkImage> TFilter;
> >> >> >        TFilter::Pointer l_pFilter=TFilter::New();
> >> >> >        if (l_pFilter.IsNull())
> >> >> >        {
> >> >> >                std::cout<<"Could not create 
> filter"<<std::endl;
> >> >> >                return;
> >> >> >        }
> >> >> >
> >> >> >        l_pFilter->SetInput(l_pIktImg);
> >> >> >        l_pFilter->SetLower(100);
> >> >> >        l_pFilter->SetUpper(130);
> >> >> >
> >> >> >        TFilter::IndexType l_Seed;
> >> >> >        l_Seed[0] = l_pImg->GetWidths()[0]>>1;
> >> >> >        l_Seed[1] = l_pImg->GetWidths()[1]>>1;
> >> >> >        l_Seed[2] = l_pImg->GetWidths()[2]>>1;
> >> >> >
> >> >> >        l_pFilter->SetSeed(l_Seed);
> >> >> >
> >> >> >        l_pFilter->DebugOn();
> >> >> >        l_pFilter->Print(std::cout);
> >> >> >
> >> >> >        try
> >> >> >        {               l_pFilter->Update();}
> >> >> >        catch( itk::ExceptionObject &excep )
> >> >> >        {
> >> >> >                std::cerr << "Exception caught !" << std::endl;
> >> >> >                std::cerr << excep << std::endl;
> >> >> >        }
> >> >> > }
> >> >> >
> >> >> > --------------------------------------------
> >> >> > Vincent Daanen, PhD
> >> >> > D&D Manager
> >> >> >
> >> >> > --------------------------------------------
> >> >> > KOELIS
> >> >> > 5, avenue du Grand Sablon 38700 La Tronche
> >> >> > www.koelis.com  -  daanen at koelis.com
> >> >> > Tel .+33(0) 476637588 Fax .+33(0) 476637592
> >> >> > --------------------------------------------
> >> >> >
> >> >> > CONFIDENTIALITY This e-mail and any attachments are
> >> >> confidential and may
> >> >> > also be privileged. If you are not the named recipient,
> >> >> please notify the
> >> >> > sender immediately and do not disclose the contents to
> >> >> another person, use
> >> >> > it for any purpose, or store or copy the information in
> >> any medium.
> >> >> >
> >> >> > "Les problèmes ne peuvent être résolus par ceux dont
> >> >> l'horizon se limite aux
> >> >> > réalités quotidiennes,  mais par ceux qui rêvent de choses
> >> >> qui n'ont jamais
> >> >> > existé et qui se disent : Pourquoi Pas ?" (J-F Kennedy, 1963).
> >> >> >
> >> >> > _____________________________________
> >> >> > 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-users
> >> >> >
> >> >
> >> >
> >
> >



More information about the Insight-users mailing list