hi all i am doing image segmentation( bone segmentaiton) with fast
marching level sets i have changed a little bit the code which is given
in the examples. the data that i am working is mri data in analyze
format. i have changed it from dicom to analyze. <br>
<br>
sigma=0.98 alfa=-0.64 beta=6 stoptime=32&nbsp; threshold=40 <br>
but am geting black images no segmented regions.<br>
i have used the insightapplication demos it worked well in that examples so what am i doing wrong i am sending the code attached<br>
<br>
<br>
#include &quot;itkCurvatureAnisotropicDiffusionImageFilter.h&quot;<br>
<br>
#include &quot;itkGradientMagnitudeRecursiveGaussianImageFilter.h&quot;<br>
#include &quot;itkSigmoidImageFilter.h&quot;<br>
<br>
<br>
<br>
<br>
#include &quot;itkImage.h&quot;<br>
#include &quot;itkFastMarchingImageFilter.h&quot;<br>
<br>
#include &quot;itkBinaryThresholdImageFilter.h&quot;<br>
<br>
#include &quot;itkImageFileReader.h&quot;<br>
#include &quot;itkImageFileWriter.h&quot;<br>
<br>
#include &quot;itkRescaleIntensityImageFilter.h&quot;<br>
<br>
<br>
int main( int argc, char *argv[] )<br>
{<br>
&nbsp; if( argc &lt; 21 )<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Missing Parameters &quot; &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; argv[0];<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot; inputImage&nbsp; outputImage seedX seedY seedZ&nbsp; seedX2 seedY2 seedZ2&quot;;<br>
&nbsp;&nbsp;&nbsp; &nbsp;std::cerr &lt;&lt; &quot;&nbsp; seedX3 seedY3 seedZ3 seedX4 seedY4 seedZ4 seedX5 seedY5 seedZ5 &quot;;<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot; Sigma SigmoidAlpha SigmoidBeta TimeThreshold StoppingValue&quot; &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; return 1;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
<br>
&nbsp;<br>
&nbsp; typedef&nbsp;&nbsp; float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternalPixelType;<br>
&nbsp; const&nbsp;&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp;&nbsp; Dimension = 3;<br>
&nbsp; typedef itk::Image&lt; InternalPixelType, Dimension &gt;&nbsp; InternalImageType;<br>
<br>
&nbsp; typedef unsigned char OutputPixelType;<br>
&nbsp; typedef itk::Image&lt; OutputPixelType, Dimension &gt; OutputImageType;<br>
<br>
<br>
<br>
&nbsp; typedef&nbsp; itk::ImageFileReader&lt; InternalImageType &gt; ReaderType;<br>
&nbsp; typedef&nbsp; itk::ImageFileWriter&lt;&nbsp; OutputImageType&nbsp; &gt; WriterType;<br>
<br>
<br>
<br>
&nbsp; ReaderType::Pointer reader = ReaderType::New();<br>
&nbsp; WriterType::Pointer writer = WriterType::New();<br>
<br>
&nbsp; reader-&gt;SetFileName( argv[1] );<br>
&nbsp; writer-&gt;SetFileName( argv[2] );<br>
<br>
<br>
&nbsp;<br>
&nbsp; typedef itk::RescaleIntensityImageFilter&lt; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InternalImageType, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
OutputImageType &gt;&nbsp;&nbsp; RescaleFilterType;<br>
<br>
<br>
<br>
// Discrete CurvatureAnistropicDiffusionImageFilter<br>
<br>
&nbsp; typedef&nbsp;&nbsp; itk::CurvatureAnisotropicDiffusionImageFilter&lt; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InternalImageType, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InternalImageType &gt;&nbsp; SmoothingFilterType;<br>
&nbsp; <br>
&nbsp; SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();<br>
&nbsp; smoothing-&gt;SetTimeStep( 0.0625 );<br>
&nbsp; smoothing-&gt;SetNumberOfIterations(&nbsp; 5 );<br>
&nbsp; smoothing-&gt; SetConductanceParameter( 3 );<br>
&nbsp; smoothing-&gt;SetInput( reader-&gt;GetOutput() );<br>
&nbsp; smoothing-&gt;Update();<br>
<br>
<br>
&nbsp; <br>
&nbsp; RescaleFilterType::Pointer rescaler = RescaleFilterType::New();<br>
&nbsp; rescaler-&gt;SetOutputMinimum(&nbsp;&nbsp; 0 );<br>
&nbsp; rescaler-&gt;SetOutputMaximum( 255 );<br>
&nbsp; rescaler-&gt;SetInput( smoothing-&gt;GetOutput() );<br>
<br>
<br>
<br>
<br>
&nbsp;//GradientMagnitudeRecursiveGaussianImageFilter<br>
<br>
&nbsp; typedef&nbsp;&nbsp; itk::GradientMagnitudeRecursiveGaussianImageFilter&lt; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InternalImageType, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InternalImageType &gt;&nbsp; GradientFilterType;<br>
&nbsp;&nbsp; GradientFilterType::Pointer&nbsp; gradientMagnitude = GradientFilterType::New();<br>
&nbsp;&nbsp; <br>
&nbsp; const double sigma = atof( argv[18] );<br>
<br>
&nbsp; gradientMagnitude-&gt;SetSigma(&nbsp; sigma&nbsp; );<br>
&nbsp; gradientMagnitude-&gt;SetInput( smoothing-&gt;GetOutput() );<br>
&nbsp; gradientMagnitude-&gt;Update();<br>
<br>
//Sigmoid filter<br>
&nbsp; typedef&nbsp;&nbsp;
itk::SigmoidImageFilter&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InternalImageType, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InternalImageType &gt;&nbsp; SigmoidFilterType;<br>
<br>
<br>
&nbsp;<br>
&nbsp; SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();<br>
&nbsp; <br>
&nbsp;<br>
&nbsp; sigmoid-&gt;SetOutputMinimum(&nbsp; 0.0&nbsp; );<br>
&nbsp; sigmoid-&gt;SetOutputMaximum(&nbsp; 1.0&nbsp; );<br>
&nbsp; <br>
&nbsp; const double alpha =&nbsp; atof( argv[19] );<br>
&nbsp; const double beta&nbsp; =&nbsp; atof( argv[20] );<br>
&nbsp; sigmoid-&gt;SetAlpha( alpha );<br>
&nbsp; sigmoid-&gt;SetBeta(&nbsp; beta&nbsp; );<br>
&nbsp; sigmoid-&gt;SetInput( gradientMagnitude-&gt;GetOutput() );<br>
&nbsp; sigmoid-&gt;Update();<br>
<br>
//Fast marching Filter<br>
<br>
&nbsp; typedef&nbsp; itk::FastMarchingImageFilter&lt; InternalImageType, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InternalImageType &gt;&nbsp;&nbsp;&nbsp; FastMarchingFilterType;<br>
<br>
&nbsp; FastMarchingFilterType::Pointer&nbsp; fastMarching = FastMarchingFilterType::New();<br>
&nbsp; typedef FastMarchingFilterType::NodeContainer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeContainer;<br>
&nbsp; typedef
FastMarchingFilterType::NodeType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
NodeType;<br>
&nbsp; <br>
&nbsp; NodeContainer::Pointer seeds = NodeContainer::New();<br>
<br>
InternalImageType::IndexType&nbsp; seedPosition;<br>
&nbsp; seedPosition[0] = atoi( argv[3] );<br>
&nbsp; seedPosition[1] = atoi( argv[4] );<br>
&nbsp; seedPosition[2] = atoi( argv[5] );<br>
InternalImageType::IndexType&nbsp; seedPosition2;<br>
&nbsp; seedPosition2[0] = atoi( argv[6] );<br>
&nbsp; seedPosition2[1] = atoi( argv[7] );<br>
&nbsp; seedPosition2[2] = atoi( argv[8] );<br>
InternalImageType::IndexType&nbsp; seedPosition3;<br>
&nbsp;&nbsp; seedPosition3[0] = atoi( argv[9] );<br>
&nbsp; seedPosition3[1] = atoi( argv[10] );<br>
&nbsp; seedPosition3[2] = atoi( argv[11] );<br>
&nbsp; InternalImageType::IndexType&nbsp; seedPosition4;<br>
&nbsp;&nbsp; seedPosition4[0] = atoi( argv[12] );<br>
&nbsp; seedPosition4[1] = atoi( argv[13] );<br>
&nbsp; seedPosition4[2] = atoi( argv[14] );<br>
&nbsp; InternalImageType::IndexType&nbsp; seedPosition5;<br>
&nbsp;&nbsp; seedPosition5[0] = atoi( argv[15] );<br>
&nbsp; seedPosition5[1] = atoi( argv[16] );<br>
&nbsp; seedPosition5[2] = atoi( argv[17] );<br>
&nbsp;// InternalImageType::IndexType&nbsp; seedPosition6;<br>
&nbsp; // seedPosition6[0] = atoi( argv[18] );<br>
&nbsp; //seedPosition6[1] = atoi( argv[19] );<br>
&nbsp; //seedPosition6[2] = atoi( argv[20] );<br>
<br>
&nbsp; NodeType node;<br>
&nbsp; NodeType node2;<br>
&nbsp; NodeType node3;<br>
&nbsp;&nbsp; NodeType node4;<br>
&nbsp; NodeType node5;<br>
&nbsp; //NodeType node6;<br>
&nbsp; const double seedValue = 0.0;<br>
&nbsp; <br>
&nbsp; node.SetValue( seedValue );<br>
&nbsp; node2.SetValue( seedValue );<br>
&nbsp; node3.SetValue( seedValue );<br>
&nbsp; node4.SetValue( seedValue );<br>
&nbsp; node5.SetValue( seedValue );<br>
&nbsp; //node6.SetValue( seedValue );<br>
<br>
&nbsp; node.SetIndex( seedPosition );<br>
&nbsp; node2.SetIndex( seedPosition2 );<br>
&nbsp; node3.SetIndex( seedPosition3 );<br>
&nbsp; node4.SetIndex( seedPosition4 );<br>
&nbsp; node5.SetIndex( seedPosition5 );<br>
&nbsp; //node6.SetIndex( seedPosition6 );<br>
<br>
&nbsp; <br>
&nbsp; seeds-&gt;Initialize();<br>
&nbsp; seeds-&gt;InsertElement( 0, node );<br>
&nbsp; seeds-&gt;InsertElement( 0, node2 );<br>
&nbsp; seeds-&gt;InsertElement( 0, node3 );<br>
&nbsp; seeds-&gt;InsertElement( 0, node4 );<br>
&nbsp; seeds-&gt;InsertElement( 0, node5 );<br>
&nbsp; //seeds-&gt;InsertElement( 0, node6 );<br>
<br>
&nbsp;fastMarching-&gt;SetTrialPoints(&nbsp; seeds&nbsp; );<br>
&nbsp;<br>
<br>
&nbsp; fastMarching-&gt;SetOutputSize( <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader-&gt;GetOutput()-&gt;GetBufferedRegion().GetSize() );<br>
&nbsp; <br>
<br>
&nbsp; const double stoppingTime = atof( argv[22] );<br>
&nbsp; fastMarching-&gt;SetStoppingValue(&nbsp; stoppingTime&nbsp; );<br>
<br>
&nbsp; fastMarching-&gt;SetInput( sigmoid-&gt;GetOutput() );<br>
&nbsp; fastMarching-&gt;Update();<br>
<br>
&nbsp; // Binary Threshold filter<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; typedef itk::BinaryThresholdImageFilter&lt; InternalImageType, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
OutputImageType&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp;
ThresholdingFilterType;<br>
&nbsp; ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();<br>
&nbsp;<br>
<br>
&nbsp; const InternalPixelType&nbsp; timeThreshold = atof( argv[21] );<br>
&nbsp; <br>
&nbsp; thresholder-&gt;SetLowerThreshold(&nbsp;&nbsp; 0.0&nbsp; );<br>
&nbsp; thresholder-&gt;SetUpperThreshold( timeThreshold&nbsp; );<br>
<br>
&nbsp; thresholder-&gt;SetOutsideValue(&nbsp; 0&nbsp; );<br>
&nbsp; thresholder-&gt;SetInsideValue(&nbsp; 1 );<br>
&nbsp; thresholder-&gt;SetInput( fastMarching-&gt;GetOutput() );<br>
&nbsp; writer-&gt;SetInput( thresholder-&gt;GetOutput() );<br>
<br>
<br>
&nbsp; try<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; writer-&gt;Update();<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp; catch( itk::ExceptionObject &amp; excep )<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Exception caught !&quot; &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; excep &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
<br>
&nbsp;<br>
&nbsp; return 0;<br>
}<br>
<br>
<br>
<br>
<br>
<br>