<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7232.77">
<TITLE>Signed Danielsson</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->
<BR>

<P><FONT SIZE=2 FACE="Arial">Hello friends,</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">I am trying to compute the Euclidean distance map on a binary volume and am getting weird results. </FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">Data is available at </FONT><A HREF="ftp://ftp.pnl.gov/outgoing/SignedDanielsson"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Arial">ftp://ftp.pnl.gov/outgoing/SignedDanielsson</FONT></U></A>
</P>

<P><FONT SIZE=2 FACE="Arial">See Screenshot.png for a look at what the cross section looks like. This is a simplification, but basically the volume is a cylinder of that cross-section. ScreenShot2.png shows the result of the Signed Danielsson Map - not what I expected. I expected zero to be the border; negative to be 'outside'; and positive to be 'inside'. Sort of like and image within an image. Reduced.mha is the header and reduced.raw.zip is the image. It is a binary image of 1 and 11 - I pass the image as floats to the itkSignedDanielssonFilter. Am I expecting the wrong thing or doing it wrong.</FONT></P>

<P><FONT SIZE=2 FACE="Arial">Any help would be greatly appreciated.</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">Dan</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">See code snippet below.</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</FONT>

<BR><FONT SIZE=2 FACE="Arial">// ITK Signed Danielsson Distance Map</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">void ThreeDFilters::distanceFilter(float *ddvimage, int xdim, int ydim, int zdim,</FONT>

<BR><FONT SIZE=2 FACE="Arial">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int numiter, QApplication *app)</FONT>

<BR><FONT SIZE=2 FACE="Arial">{</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp; </FONT>

<BR><FONT SIZE=2 FACE="Arial">// ***********************************************************************</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Preliminaries to copy the&nbsp; ddv array into an ITK Image type&nbsp;&nbsp; *</FONT>

<BR><FONT SIZE=2 FACE="Arial">// ***********************************************************************</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pass the dimensions and type of ddv array</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; typedef float PixelType;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; const unsigned int Dimension = 3;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt; ImageType;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; typedef itk::Image&lt; float, 3 &gt; ImageType;</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">// image origin</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; float ox = 0.0;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; float oy = 0.0;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; float oz = 0.0;</FONT>

<BR><FONT SIZE=2 FACE="Arial">// pixel spacing</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; float dx = 1.0;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; float dy = 1.0;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; float dz = 1.0;</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp; ImageType::Pointer itkimage = ImageType::New();</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; ImageType::SizeType size;&nbsp;&nbsp; size[0] = xdim;&nbsp;&nbsp; size[1] = ydim;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; size[2] = zdim;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; ImageType::IndexType start;&nbsp;&nbsp; start[0] = 0;&nbsp;&nbsp; start[1] = 0;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; start[2] = 0;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; ImageType::RegionType region;&nbsp;&nbsp; region.SetSize( size );&nbsp;&nbsp; region.SetIndex( start );&nbsp;&nbsp; itkimage-&gt;SetRegions( region);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; itkimage-&gt;Allocate();</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; double spacing[3];&nbsp;&nbsp; spacing[0] = dx;&nbsp;&nbsp; spacing[1] = dy;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; spacing[2] = dz;&nbsp;&nbsp; itkimage-&gt;SetSpacing( spacing );</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; double origin[3];&nbsp;&nbsp; origin[0] = ox;&nbsp;&nbsp; origin[1] = oy;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; origin[2] = oz;&nbsp;&nbsp; itkimage-&gt;SetOrigin( origin );</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; typedef itk::ImageRegionIterator&lt; ImageType&gt; IteratorType;&nbsp;&nbsp; IteratorType it( itkimage, region );&nbsp;&nbsp; it.GoToBegin();&nbsp;&nbsp; float * data = ddvimage;&nbsp;&nbsp; while( ! it.IsAtEnd() )&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; it.Set( *data);&nbsp;&nbsp;&nbsp;&nbsp; ++it;&nbsp;&nbsp;&nbsp;&nbsp; ++data;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></P>

<P><FONT SIZE=2 FACE="Arial">// ****************************************************************</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End preliminaries&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *</FONT>

<BR><FONT SIZE=2 FACE="Arial">// ****************************************************************</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp; typedef itk::RescaleIntensityImageFilter&lt; </FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageType, ImageType &gt; preRescaleFilterType;</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp; preRescaleFilterType::Pointer prerescaler = preRescaleFilterType::New();</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp; prerescaler-&gt;SetOutputMinimum(&nbsp;&nbsp; 0 );</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp; prerescaler-&gt;SetOutputMaximum( 255 );</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp; prerescaler-&gt;SetInput( itkimage );</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIGNED DISTANCE MAP WITH AUTOMATIC RESCALING</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; typedef&nbsp;&nbsp;&nbsp; float&nbsp;&nbsp;&nbsp; OutputPixelType;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; typedef itk::Image&lt; OutputPixelType, 3 &gt;&nbsp;&nbsp; OutputImageType;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; typedef itk::SignedDanielssonDistanceMapImageFilter&lt;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageType, </FONT>

<BR><FONT SIZE=2 FACE="Arial">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputImageType &gt;&nbsp; FilterType;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; FilterType::Pointer filter = FilterType::New(); </FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; filter-&gt;SetInput( itkimage );</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp; typedef itk::RescaleIntensityImageFilter&lt; </FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputImageType, OutputImageType &gt; RescaleFilterType;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; RescaleFilterType::Pointer rescaler = RescaleFilterType::New();</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; rescaler-&gt;SetOutputMinimum(&nbsp;&nbsp; 0L );</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; rescaler-&gt;SetOutputMaximum( 65535L );</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; rescaler-&gt;SetInput( filter-&gt;GetOutput() );</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">// **************************************************************</FONT>

<BR><FONT SIZE=2 FACE="Arial">//&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; End Filter&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; *</FONT>

<BR><FONT SIZE=2 FACE="Arial">// **************************************************************</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">// **************************************************************</FONT>

<BR><FONT SIZE=2 FACE="Arial">// Begin Conclusion: This writes the image back to the local&nbsp;&nbsp;&nbsp; *</FONT>

<BR><FONT SIZE=2 FACE="Arial">// buffer and should be written as a generic callable function&nbsp; *</FONT>

<BR><FONT SIZE=2 FACE="Arial">// **************************************************************</FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; PixelType* pixelData= static_cast&lt;PixelType* &gt;(ddvimage);&nbsp;&nbsp; const bool filterWillDeleteTheInputBuffer = false;&nbsp;&nbsp; const unsigned int totalNumberOfPixels = xdim*ydim*zdim;&nbsp;&nbsp; rescaler-&gt;GetOutput()-&gt;GetPixelContainer()-&gt;SetImportPointer(pixelData, &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalNumberOfPixels,filterWillDeleteTheInputBuffer);&nbsp;&nbsp; rescaler-&gt;GetOutput()-&gt;Allocate();&nbsp;&nbsp; rescaler-&gt;Update();</FONT></P>

<P><FONT SIZE=2 FACE="Arial">// </FONT>

<BR><FONT SIZE=2 FACE="Arial">//</FONT>

<BR><FONT SIZE=2 FACE="Arial">printf(&quot;done ITK Signed Danielsson Distance Map\n&quot;);</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; if ( pd ) {</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; delete pd;</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; QApplication::restoreOverrideCursor(); </FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp; }</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">}</FONT>

<BR><FONT FACE="Times New Roman">Daniel R Einstein, PhD<BR>
Biological Monitoring and Modeling<BR>
Pacific Northwest National Laboratory<BR>
P.O. Box 999; MSIN P7-58<BR>
Richland, WA 99352<BR>
Tel: 509/ 376-2924<BR>
Fax: 509/376-9064<BR>
</FONT><A HREF="mailto:daniel.einstein@pnl.gov"><U><FONT COLOR="#0000FF" FACE="Times New Roman">daniel.einstein@pnl.gov</FONT></U></A>
</P>
<BR>
<BR>

<P><FONT FACE="Times New Roman">Daniel R Einstein, PhD<BR>
Biological Monitoring and Modeling<BR>
Pacific Northwest National Laboratory<BR>
P.O. Box 999; MSIN P7-58<BR>
Richland, WA 99352<BR>
Tel: 509/ 376-2924<BR>
Fax: 509/376-9064<BR>
</FONT><A HREF="mailto:daniel.einstein@pnl.gov"><U><FONT COLOR="#0000FF" FACE="Times New Roman">daniel.einstein@pnl.gov</FONT></U></A>
</P>
<BR>

</BODY>
</HTML>