<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>
Greetings, <BR>
&nbsp;<BR>
I found the flaw in my logic regarding my question (below)&nbsp;with regards to image resampling with different interpolators. I guess what I really needed was image rescaling instead of resampling. I do have a follow-up question though. As a reminder, I have an image that contains contour information for a CT dataset. The voxels where the contour is present have a value of 1000 while the other voxels have zero. Thus,&nbsp;if you look at different slices, you see an outline of an object. Now I&nbsp;have&nbsp;a different image set of the same object except that the&nbsp;second image set is&nbsp;different somehow - different number of&nbsp;voxels and/or different voxel dimension and/or different origin. I want to resample the original contour to see where it should lie on the&nbsp;second set. I&nbsp;thought of doing a resample but I realize that&nbsp;some of the contours&nbsp;do not end up continuous necessarily.&nbsp;So maybe I need to rescale? But what about the&nbsp;origin being in a different location?&nbsp;<BR>
&nbsp;<BR>
As an alternative, I thought I could&nbsp;fill each contour to&nbsp;have a "blob" instead of an outline. Then I could resample and maybe use an edge detection to get the contour outline. Does ITK have a function to fill in an object given the outline? Any ideas and or suggestions would be very welcome. Thank you. <BR>
&nbsp;<BR>
Vik<BR>
<BR>&gt; ------------------------------<BR>&gt; <BR>&gt; Good morning,<BR>&gt; <BR>&gt; I am trying to resample contours and am running into a bit of a problem. The method I am using is as follows: I create a matrix of zeros which is as big as the image set I am looking at. If a contour is present on a particular voxel, I set that voxel's value to 1000. I then use the code below to resample the matrix. The first case I tried was to scale all axial images by 1/2 (keeping offsets constant). When I use the NearestNeighborInterpolateImageFunction, I get the results I expect, with the occasional breaks in the contour. When I switch to the LinearInterpolateImageFunction, my instincts tell me I should get the same contour as before, except with the value of 500 instead of 1000. However, I get the exact same results as with the nearest neighbor method. Same for the BSplineInterpolateImageFunction, which incidentally does take much longer to run. I woul dvery much appreciate it if someone could point me to the mistake I am making, either with the code or with my thought <BR>&gt; process... Thank you for your help. <BR>&gt; Vik<BR>&gt; <BR>&gt; Code: <BR>&gt; <BR>&gt; #include "itkImage.h"#include "itkImageFileReader.h"#include "itkImageFileWriter.h"#include "itkResampleImageFilter.h"#include "itkLinearInterpolateImageFunction.h"<BR>&gt; <BR>&gt; int main( int argc, char * argv[] ){ if( argc &lt; 3 ) { std::cerr &lt;&lt; "Usage: " &lt;&lt; std::endl; std::cerr &lt;&lt; argv[0] &lt;&lt; " Resampleto.mhd currentcontour.mhd " &lt;&lt; std::endl; return EXIT_FAILURE; }<BR>&gt; <BR>&gt; const unsigned int Dimension = 3; typedef unsigned short PixelType;<BR>&gt; <BR>&gt; typedef itk::Image&lt; PixelType, Dimension &gt; FixedImageType; typedef itk::Image&lt; PixelType, Dimension &gt; MovingImageType; typedef itk::Image&lt; PixelType, Dimension &gt; OutputImageType;<BR>&gt; typedef itk::ImageFileReader&lt; FixedImageType &gt; ReaderType; typedef itk::ImageFileReader&lt; MovingImageType &gt; ReaderType; typedef itk::ImageFileWriter&lt; OutputImageType &gt; WriterType;<BR>&gt; <BR>&gt; ReaderType::Pointer fixedreader = ReaderType::New(); ReaderType::Pointer movingreader = ReaderType::New(); WriterType::Pointer writer = WriterType::New();<BR>&gt; fixedreader-&gt;SetFileName( argv[1] ); movingreader-&gt;SetFileName( argv[2] ); writer-&gt;SetFileName( "Resampledcontours.mhd" );<BR>&gt; fixedreader-&gt;Update();<BR>&gt; <BR>&gt; typedef itk::ResampleImageFilter&lt; MovingImageType, OutputImageType &gt; FilterType; FilterType::Pointer filter = FilterType::New(); typedef itk::IdentityTransform&lt; double, Dimension &gt; TransformType; TransformType::Pointer transform = TransformType::New(); transform-&gt;SetIdentity(); filter-&gt;SetTransform( transform );<BR>&gt; <BR>&gt; typedef itk::LinearInterpolateImageFunction&lt; MovingImageType, double &gt; InterpolatorType; InterpolatorType::Pointer interpolator = InterpolatorType::New(); filter-&gt;SetInterpolator( interpolator );<BR>&gt; filter-&gt;SetDefaultPixelValue( 0 );<BR>&gt; <BR>&gt; double spacing[ Dimension ];<BR>&gt; spacing[0] = fixedreader-&gt;GetOutput()-&gt;GetSpacing()[0]; spacing[1] = fixedreader-&gt;GetOutput()-&gt;GetSpacing()[1]; spacing[2] = fixedreader-&gt;GetOutput()-&gt;GetSpacing()[2]; filter-&gt;SetOutputSpacing( spacing );<BR>&gt; <BR>&gt; double origin[ Dimension ]; origin[0] = fixedreader-&gt;GetOutput()-&gt;GetOrigin()[0]; origin[1] = fixedreader-&gt;GetOutput()-&gt;GetOrigin()[1]; origin[2] = fixedreader-&gt;GetOutput()-&gt;GetOrigin()[2]; filter-&gt;SetOutputOrigin( origin );<BR>&gt; <BR>&gt; filter-&gt;SetSize( fixedreader-&gt;GetOutput()-&gt;GetLargestPossibleRegion().GetSize() );<BR>&gt; <BR>&gt; filter-&gt;SetInput( movingreader-&gt;GetOutput() ); writer-&gt;SetInput( filter-&gt;GetOutput() ); try { writer-&gt;Update(); } catch( itk::ExceptionObject &amp; excep ) { std::cerr &lt;&lt; "Exception catched !" &lt;&lt; std::endl; std::cerr &lt;&lt; excep &lt;&lt; std::endl; }<BR>&gt; return EXIT_SUCCESS;}<BR>&gt; <BR><BR><br /><hr />Want to do more with Windows Live? Learn “10 hidden secrets” from Jamie. <a href='http://windowslive.com/connect/post/jamiethomson.spaces.live.com-Blog-cns!550F681DAD532637!5295.entry?ocid=TXT_TAGLM_WL_domore_092008' target='_new'>Learn Now</a></body>
</html>