[Insight-users] Geodesic Active Contours Segmentation with 3D volumes
Dan Mueller
dan.muel at gmail.com
Mon Jul 14 02:05:16 EDT 2008
Hi Rehab,
Having a look at the Fast Marching code
(itkFastMarchingImageFilter.txx @ line 492), your error "Discriminant
of quadratic equation is negative" probably occurs because the speed
image is not valid. Please ensure it has spacing > 0.0 and is in the
range [0.0, 1.0].
Please let us know if this is the problem.
Regards, Dan
2008/7/11 Rehab Mansour <rehab_a_eg at yahoo.co.uk>:
> Hi Dan,
> Thanks alot for the reply,i tried what u have done and it worked but it's
> giving me this error now also in the fast marching filter :
>
> "Discriminant of quadratic equation is negative"
> Location: double __thiscall itk::FastMarchingImageFilter<class
> itk::Image<float,3>,class itk::Image<float,3> >::UpdateValue(const class
> itk::Index<3> &,const class itk::Image<float,3> *,class itk::Image<float,3>
> *)
>
> that's the piece of the code about the fast marching filter
>
> List<NodeType> Seeds = new List<NodeType>();
> double SeedValue = double.Parse(v3);
> IndexType SeedPosition = new IndexType(209, 284,17);
> Seeds.Add(new NodeType(SeedValue, SeedPosition));
> FastMarchingFilterType.TrialPoints = Seeds.ToArray();
> FastMarchingFilterType.SpeedConstant = 1.0;
> FastMarchingFilterType.OutputSize = PNGSeries.Size;
> FastMarchingFilterType.OutputSpacing = PNGSeries.Spacing;
>
> //////////////////////////////////////////////////////////////////////
> FastMarchingFilterType.OutputSize =
> PNGSeries.BufferedRegion.Size;
>
> it is giving me this error when executing the update of the pipeline.
>
> any idea?
> again thanks a lot for all the help you are giving.
> Rehab
> ----- Original Message ----
> From: Dan Mueller <dan.muel at gmail.com>
> To: Rehab Mansour <rehab_a_eg at yahoo.co.uk>
> Cc: ITK <insight-users at itk.org>; Gaëtan Lehmann
> <gaetan.lehmann at jouy.inra.fr>
> Sent: Thursday, 10 July, 2008 7:20:52 AM
> Subject: Re: [Insight-users] Geodesic Active Contours Segmentation with 3D
> volumes
>
> 2008/7/10 Dan Mueller <dan.muel at gmail.com>:
>> Second, the Fast Marching filter does it's operation in floating
>> point. In native ITK, you *can* use integer input images (such as
>> signed short), provided you use the NormalizationFactor property
>> (please read the documentation in itkFastMarchingImageFilter.cxx).
>> Unfortunately, you have spotted a problem with ManagedITK: it does not
>> produce Fast Marching wrappers for integer images. I will fix this in
>> the next version. You can fix it yourself by adding the following
>> lines to
>> ManagedITK\Source\Modules\LevelSetFilters\managed_itkFastMarchingImageFilter.cmake:
>> WRAP_IMAGE_FILTER_REAL(2)
>> WRAP_IMAGE_FILTER_USIGN_INT(2) # Add this line
>> WRAP_IMAGE_FILTER_SIGN_INT(2) # Add this line
>>
>> (Gaëtan: I also notice WrapITK has these lines missing/commented out.
>> Another reason to integrate!)
>
> On closer inspection, adding these two lines is not the best solution.
> Wrappers should also be generated for integer inputs and real
> outputs...
>
>> Finally, the IndexOutOfRangeException seems to be occurring because
>> you are creating a 2D index for SeedPosition, rather than a 3D index.
>> Try something like this:
>> IndexType SeedPosition = new IndexType(int.Parse(v1),
>> int.Parse(v2), int.Parse(v3));
>> Seeds.Add(new NodeType(SeedValue, SeedPosition));
>>
>> Hope this helps.
>>
>> Regards, Dan
>>
>> 2008/7/9 Rehab Mansour <rehab_a_eg at yahoo.co.uk>:
>>> Hi everyone,
>>> I am using ManagedITK with c#,i am still a begginer so i have lots of
>>> questions in my hand....i have applied Level set Geodesic Active Contours
>>> Segmentation on an image and it worked effectively thank God...now i am
>>> trying to apply it on a 3D volume(series of images) ,this is the code i
>>> am
>>> using
>>>
>>> itkImageBase DicomSeries = itkImage_SS3.New();
>>> itkImageBase PNGSeries = itkImage_F3.New();
>>> itkImageBase Segmented = itkImage_UC3.New();
>>> DicomSeries.ReadDicomDirectory(@"C:\Rehab\p6\1");
>>> itkRescaleIntensityImageFilter_ISS3IF3 ConvertDCMtoPNG =
>>>
>>> itkRescaleIntensityImageFilter_ISS3IF3.New();
>>> ConvertDCMtoPNG.SetInput(DicomSeries);
>>> ConvertDCMtoPNG.OutputMinimum = 0;
>>> ConvertDCMtoPNG.OutputMaximum = 255;
>>> ConvertDCMtoPNG.GetOutput(PNGSeries);
>>> ConvertDCMtoPNG.Update();
>>> itkBinaryThresholdImageFilter_IF3IUC3
>>> ThresholdingFilterType
>>> = itkBinaryThresholdImageFilter_IF3IUC3.New();
>>> ThresholdingFilterType.SetInput(PNGSeries);
>>> ThresholdingFilterType.LowerThreshold = -1000.0;
>>> ThresholdingFilterType.UpperThreshold = 0.0;
>>> ThresholdingFilterType.OutsideValue = 0;
>>> ThresholdingFilterType.InsideValue = 255;
>>> itkRescaleIntensityImageFilter_IF3IUC3 CastFilterType1 =
>>> itkRescaleIntensityImageFilter_IF3IUC3.New();
>>> itkRescaleIntensityImageFilter_IF3IUC3 CastFilterType2 =
>>> itkRescaleIntensityImageFilter_IF3IUC3.New();
>>> itkRescaleIntensityImageFilter_IF3IUC3 CastFilterType3 =
>>> itkRescaleIntensityImageFilter_IF3IUC3.New();
>>> itkRescaleIntensityImageFilter_IF3IUC3 CastFilterType4 =
>>> itkRescaleIntensityImageFilter_IF3IUC3.New();
>>> itkCurvatureAnisotropicDiffusionImageFilter_IF3IF3
>>> SmoothingFilterType =
>>> itkCurvatureAnisotropicDiffusionImageFilter_IF3IF3.New();
>>> SmoothingFilterType.TimeStep = 0.0625;
>>> SmoothingFilterType.NumberOfIterations = 5;
>>> SmoothingFilterType.ConductanceParameter = 9.0;
>>>
>>>
>>> itkGradientMagnitudeRecursiveGaussianImageFilter_IF3IF3
>>> GradientFilterType =
>>> itkGradientMagnitudeRecursiveGaussianImageFilter_IF3IF3.New();
>>> itkSigmoidImageFilter_IF3IF3 SigmoidFilterType =
>>> itkSigmoidImageFilter_IF3IF3.New();
>>> SigmoidFilterType.OutputMinimum = 0.0;
>>> SigmoidFilterType.OutputMaximum = 1.0;
>>> GradientFilterType.Sigma = double.Parse(v4);
>>> SigmoidFilterType.Alpha = double.Parse(v5);
>>> SigmoidFilterType.Beta = double.Parse(v6);
>>> itkFastMarchingImageFilter_IF3IF3 FastMarchingFilterType =
>>> itkFastMarchingImageFilter_IF3IF3.New();
>>> itkGeodesicActiveContourLevelSetImageFilter_IF3IF3F
>>> geodesicActivecontour =
>>> itkGeodesicActiveContourLevelSetImageFilter_IF3IF3F.New();
>>>
>>>
>>> //command line variable
>>> geodesicActivecontour.PropagationScaling = int.Parse(v7);
>>> geodesicActivecontour.CurvatureScaling = 1.0;
>>> geodesicActivecontour.AdvectionScaling = 1.0;
>>> geodesicActivecontour.MaximumRMSError = 0.02;
>>> geodesicActivecontour.NumberOfIterations = 800;
>>> ///////////////The pipeline\\\\\\\\\\\\\\\\\\\\\\\\
>>> SmoothingFilterType.SetInput(PNGSeries);
>>>
>>> GradientFilterType.SetInput(SmoothingFilterType.GetOutput());
>>>
>>> SigmoidFilterType.SetInput(GradientFilterType.GetOutput());
>>> List<NodeType> Seeds = new List<NodeType>();
>>> double SeedValue = -double.Parse(v3);
>>> IndexType SeedPosition = new IndexType(int.Parse(v1),
>>> int.Parse(v2));
>>> Seeds.Add(new NodeType(SeedValue, SeedPosition));
>>> FastMarchingFilterType.TrialPoints = Seeds.ToArray();
>>> FastMarchingFilterType.SpeedConstant = 1.0;
>>> FastMarchingFilterType.OutputSize = PNGSeries.Size;
>>> FastMarchingFilterType.OutputSpacing = PNGSeries.Spacing;
>>>
>>> //////////////////////////////////////////////////////////////////////
>>> FastMarchingFilterType.OutputSize =
>>> PNGSeries.BufferedRegion.Size;
>>>
>>> FastMarchingFilterType.SetInput(SigmoidFilterType.GetOutput());
>>>
>>> geodesicActivecontour.SetInput(FastMarchingFilterType.GetOutput());
>>>
>>> geodesicActivecontour.SetFeatureImage(SigmoidFilterType.GetOutput());
>>>
>>> ThresholdingFilterType.SetInput(geodesicActivecontour.GetOutput());
>>> ThresholdingFilterType.Update();
>>> ThresholdingFilterType.GetOutput(Segmented);
>>> Segmented.WriteSeries("segmented_{0}.png","00");
>>>
>>> i am having a problem at the fast marching filter...it doesn't accept the
>>> seeds,i am giving it for it's trial point,
>>> this line: FastMarchingFilterType.TrialPoints = Seeds.ToArray();
>>> this is the exception i am getting:
>>> System.IndexOutOfRangeException was caught
>>> Message="Index was outside the bounds of the array."
>>> Source="ManagedITK.Common"
>>> StackTrace:
>>> at itk.itkArray`1.get_Item(Int32 index)
>>> at
>>> itk.ManagedTypes.ToNativeLevelSetNode<float,3>(LevelSetNode<float\,3>* ,
>>> itkLevelSetNode managedNode)
>>> at
>>> itk.ManagedTypes.ToNativeLevelSetNodeContainer<float,3>(itkLevelSetNode[]
>>> managedContainer)
>>> at
>>> itk.itkFastMarchingImageFilter_IF3IF3.set_TrialPoints(itkLevelSetNode[]
>>> value)
>>> at LevelSetActiveContour.Form1.button5_Click(Object sender,
>>> EventArgs
>>> e) in C:\Users\HP\Documents\Visual Studio
>>> 2005\Projects\LevelSetActiveContour\LevelSetActiveContour\Form1.cs:line
>>> 551
>>>
>>>
>>>
>>> Any idea anyone??!!
>>> i have also two questions:
>>>
>>> when i tried this code and before the fastmarching filter...it took so
>>> much
>>> processing time to update the filters...is taking a 3D volume was a wrong
>>> idea to start with???should i make a loop and apply the pipleine for each
>>> slice individually..will this make it any fast???
>>> the other question is ....why the filters only accept float values??..the
>>> major extension we all would be working on is Dicom..so shouln't it
>>> accept
>>> dicom from the start??.....(i am sorry for this silly question i am just
>>> wondering)...my technique is to convert the dicom series i have into any
>>> other series but when i give it a large range it takes a huge processing
>>> time so i thought i will only stick to 0-->255,but it's so much waste of
>>> information
>>>
>>> Thanx for the hep in advance
>>>
>>> ________________________________
>>> Not happy with your email address?
>>> Get the one you really want - millions of new email addresses available
>>> now
>>> at Yahoo!
>>> _______________________________________________
>>> Insight-users mailing list
>>> Insight-users at itk.org
>>> http://www.itk.org/mailman/listinfo/insight-users
>>>
>>>
>>
>
> ________________________________
> Not happy with your email address?
> Get the one you really want - millions of new email addresses available now
> at Yahoo!
More information about the Insight-users
mailing list