Hi,<br>I have some trouble using itkApproximateSignedDistanceMapImageFilter on several DICOM datasets, all of size 256x256x229. Basically, I&#39;m thresholding the data to a binary image, using a cast filter from short to double (I&#39;ve tried float, too) and applying the distance field filter. For some data sets this works fine. On others I get the following error:<br>

<br><i>excp&nbsp;&nbsp;&nbsp; {m_Location=&quot;void __thiscall itk::MultiThreader::SingleMethodExecute(void)&quot; m_Description=&quot;itk::ERROR: MultiThreader(02144028): Exception occurred during SingleMethodExecute<br>c:\itk\insight\code\algorithms\itkIsoContourDistanceImageFilter.txx:330:<br>

itk::ERROR: IsoContourDistanceImageFilter(054C0948): Gradient norm is lower than pixel precision&quot; m_What=&quot;..\..\..\Insight\Code\Common\itkMultiThreade .&nbsp;&nbsp;</i>&nbsp; <br><br>All datasets have the same characteristics. Sometimes, if it doesn&#39;t work on the whole dataset, it will work on some subsets, but I couldn&#39;t find a pattern. My code is attached below. Any help would be greatly appreciated.<br>
<br>Thank&nbsp; you,<br>Alex<br><br>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<br>
&nbsp; typedef signed short&nbsp;&nbsp;&nbsp; PixelType;<br>&nbsp; const unsigned int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dimension = 3;<br><br>&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageType;<br>&nbsp; typedef itk::ImageSeriesReader&lt; ImageType &gt;&nbsp;&nbsp;&nbsp;&nbsp; ReaderType;<br>
<br><br>&nbsp; typedef itk::GDCMImageIO&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; ImageIOType;<br>&nbsp; typedef itk::GDCMSeriesFileNames&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NamesGeneratorType;<br><br>&nbsp; ImageIOType::Pointer gdcmIO = ImageIOType::New();<br>&nbsp; NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();<br>
<br>&nbsp; namesGenerator-&gt;SetInputDirectory( argv[1] );<br><br>&nbsp; const ReaderType::FileNamesContainer &amp; filenames = <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; namesGenerator-&gt;GetInputFileNames();<br><br>&nbsp; ReaderType::Pointer reader = ReaderType::New();<br>
<br>&nbsp; reader-&gt;SetImageIO( gdcmIO );<br>&nbsp; reader-&gt;SetFileNames( filenames );<br><br><br>&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; reader-&gt;Update();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; catch (itk::ExceptionObject &amp;excp)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Exception thrown while writing the image&quot; &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; excp &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>&nbsp;&nbsp;&nbsp; }<br><br><br>//***************************************************************<br><br><br>&nbsp; &nbsp; typedef double&nbsp;&nbsp;&nbsp; InternPixelType;<br><br>&nbsp;&nbsp;&nbsp; typedef&nbsp; itk::Image&lt; InternPixelType, 3 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternImageType;<br>
&nbsp;&nbsp;&nbsp; typedef&nbsp; itk::ConnectedThresholdImageFilter&lt; ImageType,&nbsp; ImageType &gt;&nbsp;&nbsp; ThreshFilterType;<br>&nbsp;&nbsp;&nbsp; typedef&nbsp; itk::MinimumMaximumImageCalculator&lt; ImageType&gt;&nbsp;&nbsp;&nbsp; MinMaxFilterType;<br>&nbsp;&nbsp;&nbsp; typedef&nbsp; itk::CastImageFilter&lt; ImageType, InternImageType &gt;&nbsp;&nbsp; CastFilterType;<br>
&nbsp;&nbsp;&nbsp; typedef&nbsp; itk::ApproximateSignedDistanceMapImageFilter&lt; InternImageType,&nbsp; InternImageType &gt;&nbsp;&nbsp; DistanceFilterType;<br><br>&nbsp;&nbsp;&nbsp; MinMaxFilterType::Pointer minMaxFilter = MinMaxFilterType::New();<br>&nbsp;&nbsp;&nbsp; ThreshFilterType::Pointer threshFilter = ThreshFilterType::New();<br>
&nbsp;&nbsp;&nbsp; DistanceFilterType::Pointer distFilter = DistanceFilterType::New();<br>&nbsp;&nbsp;&nbsp; CastFilterType::Pointer castFilter = CastFilterType::New();<br><br>&nbsp;&nbsp;&nbsp; PixelType maxValue;<br>&nbsp;&nbsp;&nbsp; PixelType minValue;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if(argc == 4)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; minValue = atoi(argv[3]);<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; minValue = 600;<br><br>&nbsp;&nbsp;&nbsp; itk::Index&lt;3&gt; seed;<br><br>&nbsp;&nbsp;&nbsp; minMaxFilter-&gt;SetImage(reader-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp; minMaxFilter-&gt;Compute();<br>&nbsp;&nbsp;&nbsp; maxValue = minMaxFilter-&gt;GetMaximum();<br>
&nbsp;&nbsp;&nbsp; seed = minMaxFilter-&gt;GetIndexOfMaximum();<br><br>&nbsp;&nbsp;&nbsp; threshFilter-&gt;SetInput(reader-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp; threshFilter-&gt;SetUpper( maxValue );<br>&nbsp;&nbsp;&nbsp; threshFilter-&gt;SetLower( minValue );<br>&nbsp;&nbsp;&nbsp; threshFilter-&gt;SetReplaceValue(255);<br>
&nbsp;&nbsp;&nbsp; threshFilter-&gt;AddSeed( seed );<br>&nbsp;&nbsp;&nbsp; threshFilter-&gt;Update();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; castFilter-&gt;SetInput(threshFilter-&gt;GetOutput());<br>&nbsp;&nbsp;&nbsp; castFilter-&gt;Update();<br><br>&nbsp;&nbsp;&nbsp; distFilter-&gt;SetInput(castFilter-&gt;GetOutput());<br>
&nbsp;&nbsp;&nbsp; distFilter-&gt;SetInsideValue(255);<br>&nbsp;&nbsp;&nbsp; distFilter-&gt;SetOutsideValue(0);<br>&nbsp;&nbsp;&nbsp; distFilter-&gt;Update();<br><br>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<br>