Luis and Jim,<br><br>I will try to describe what I'm trying to do more clearly.&nbsp; I want to create a colored output image that is identical to pixel spacing and size as the input image.&nbsp; An index and size specified at the command prompt will provide a region in which the colors of the input image will be averaged and outputed as one value in the exact same corresponding region in the output image.&nbsp; It will produce an output image that looks like the input image except for the 'color smearing' in region of interest.
<br><br>I tried setting the index to [0,0] and non-zero values at the command prompt but the *.exe still crashes so I don't think it would be a problem with the ImageFileWriter.&nbsp; Below is the whole file..<br><br>Jared<br>
<br>#include &quot;itkImage.h&quot;<br>#include &quot;itkImageRegionConstIterator.h&quot;<br>#include &quot;itkImageRegionIterator.h&quot;<br>#include &quot;itkImageFileReader.h&quot;<br>#include &quot;itkImageFileWriter.h
&quot;<br><br>int main( int argc, char *argv[] ) {<br><br>&nbsp;&nbsp;&nbsp; // Verify the number of parameters on the command line.<br>&nbsp;&nbsp;&nbsp; if ( argc &lt; 7 )&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Missing parameters. &quot; &lt;&lt; std::endl;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; argv[0]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;&lt; &quot; inputImageFile outputImageFile originX originY lengthX lengthY&quot;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;&lt; std::endl;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; // Color Pixel Type<br>&nbsp;&nbsp;&nbsp; typedef itk::RGBPixel&lt;unsigned char&gt; PixelType;<br>&nbsp;&nbsp;&nbsp; // ND Type<br>&nbsp;&nbsp;&nbsp; const unsigned int Dimension = 2;<br>&nbsp;&nbsp;&nbsp; // Image Type<br>&nbsp;&nbsp;&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt; ImageType;
<br>&nbsp;&nbsp;&nbsp; // Image File Reader Type<br>&nbsp;&nbsp;&nbsp; typedef itk::ImageFileReader&lt; ImageType &gt; ReaderType;<br>&nbsp;&nbsp;&nbsp; // Image File Writer Type<br>&nbsp;&nbsp;&nbsp; typedef itk::ImageFileWriter&lt; ImageType &gt; WriterType;<br>&nbsp;&nbsp;&nbsp; // Image Region Constant Iterator Type
<br>&nbsp;&nbsp;&nbsp; typedef itk::ImageRegionConstIterator&lt;ImageType&gt;<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; ConstIteratorType;<br>&nbsp;&nbsp;&nbsp; // Image Region Iterator Type<br>&nbsp;&nbsp;&nbsp; typedef itk::ImageRegionIterator&lt;ImageType&gt;<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; IteratorType;
<br><br>&nbsp;&nbsp;&nbsp; ////////////////////////////////////////////////////////////////<br>&nbsp;&nbsp;&nbsp; /* try updating the reader */<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; ReaderType::Pointer reader = ReaderType::New();<br>&nbsp;&nbsp;&nbsp; reader-&gt;SetFileName(argv[1]);<br>
&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; reader-&gt;Update();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch(itk::ExceptionObject &amp;err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;ExceptionObject caught!&quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; err &lt;&lt; std::endl;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ImageType::ConstPointer sourceImage = reader-&gt;GetOutput();<br><br><br>&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////////////////<br>&nbsp;&nbsp;&nbsp; /* create the writer&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; //<br>&nbsp;&nbsp;&nbsp; WriterType::Pointer writer = WriterType::New();<br>&nbsp;&nbsp;&nbsp; writer-&gt;SetFileName(argv[2]);<br><br><br>&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////////////////<br>&nbsp;&nbsp;&nbsp; /* create the region in source to read from&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */
<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; ImageType::RegionType sourceInputRegion;<br>&nbsp;&nbsp;&nbsp; ImageType::RegionType::IndexType sourceRegionStartIndex;<br>&nbsp;&nbsp;&nbsp; ImageType::RegionType::SizeType sourceRegionStartSize;<br><br>&nbsp;&nbsp;&nbsp; sourceRegionStartIndex[0] = ::atoi(argv[3]);
<br>&nbsp;&nbsp;&nbsp; sourceRegionStartIndex[1] = ::atoi(argv[4]);<br><br>&nbsp;&nbsp;&nbsp; sourceRegionStartSize[0] = ::atoi(argv[5]);<br>&nbsp;&nbsp;&nbsp; sourceRegionStartSize[1] = ::atoi(argv[6]);<br><br>&nbsp;&nbsp;&nbsp; sourceInputRegion.SetSize(sourceRegionStartSize);<br>
&nbsp;&nbsp;&nbsp; sourceInputRegion.SetIndex(sourceRegionStartIndex);<br><br><br>&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////////////////<br>&nbsp;&nbsp;&nbsp; /* create the region to output into the output image&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; ImageType::RegionType outputRegion;
<br><br>&nbsp;&nbsp;&nbsp; outputRegion.SetSize(sourceRegionStartSize);<br>&nbsp;&nbsp;&nbsp; outputRegion.SetIndex(sourceRegionStartIndex);<br>&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////////////////<br>&nbsp;&nbsp;&nbsp; /* Allocate an output image and set valid values to
<br>&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; some of the basic image information during the<br>&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; copying process.&nbsp; The starting index of the output<br>&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; region is now filled with zero values and the<br>&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; cooridinates of the physical origin are computed
<br>&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; as a shift from the origin of the input image.<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; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; ImageType::Pointer outputImage = ImageType::New();<br>&nbsp;&nbsp;&nbsp; const ImageType::SpacingType&amp; spacing =
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; reader-&gt;GetOutput()-&gt;GetSpacing();<br>&nbsp;&nbsp;&nbsp; const ImageType::PointType&amp; inputOrigin =<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; reader-&gt;GetOutput()-&gt;GetOrigin();<br>&nbsp;&nbsp;&nbsp; double outputOrigin[Dimension];
<br><br>&nbsp;&nbsp;&nbsp; for(unsigned int i=0; i&lt;Dimension; i++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; outputOrigin[i] = inputOrigin[i]+spacing[i]*sourceRegionStartIndex[i];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; outputImage-&gt;SetSpacing(spacing);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Same pixel spacing as input image
<br>&nbsp;&nbsp;&nbsp; outputImage-&gt;SetOrigin(outputOrigin);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Same origin as input image<br>&nbsp;&nbsp;&nbsp; outputImage-&gt;SetLargestPossibleRegion(sourceImage-&gt;GetLargestPossibleRegion());<br>&nbsp;&nbsp;&nbsp; outputImage-&gt;SetBufferedRegion(outputRegion);
<br>&nbsp;&nbsp;&nbsp; outputImage-&gt;SetRequestedRegion(outputRegion);<br>&nbsp;&nbsp;&nbsp; //outputImage-&gt;SetRegions(outputRegion);<br>&nbsp;&nbsp;&nbsp; outputImage-&gt;Allocate();<br><br>&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////////////////<br>&nbsp;&nbsp;&nbsp; /* Image Region Constant Iterator&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */
<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; ConstIteratorType inputIt(reader-&gt;GetOutput(),sourceInputRegion);<br>&nbsp;&nbsp;&nbsp; IteratorType outputIt(outputImage,outputImage-&gt;GetBufferedRegion());<br><br>&nbsp;&nbsp;&nbsp; int i = 0;<br>&nbsp;&nbsp;&nbsp; PixelType averageTemp, average;
<br>&nbsp;&nbsp;&nbsp; for( inputIt.GoToBegin(); !inputIt.IsAtEnd() ;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ++inputIt) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(i!=0){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; averageTemp = inputIt.Get();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; average.SetRed(int((average.GetRed()+averageTemp.GetRed())/2.0));
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; average.SetGreen(int((average.GetGreen()+averageTemp.GetGreen())/2.0));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; average.SetBlue(int((average.GetBlue()+averageTemp.GetBlue())/2.0));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; averageTemp = inputIt.Get();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; average.SetRed(int(averageTemp.GetRed()));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; average.SetGreen(int(averageTemp.GetGreen()));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; average.SetBlue(int(averageTemp.GetBlue
()));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br><br>&nbsp;&nbsp;&nbsp; for( outputIt.GoToBegin() ; !outputIt.IsAtEnd() ;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ++outputIt) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; outputIt.Set(average);<br>&nbsp;&nbsp;&nbsp; }<br><br><br>&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////////////////
<br>&nbsp;&nbsp;&nbsp; /* Setting attributes to writer&nbsp;&nbsp;&nbsp; and writing data&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; writer-&gt;SetInput(outputImage);<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; writer-&gt;Update();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch(itk::ExceptionObject &amp;err) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;ExceptionObject caught!&quot; &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; err &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br><br><div><span class="gmail_quote">
On 5/12/06, <b class="gmail_sendername">Miller, James V (GE, Research)</b> &lt;<a href="mailto:millerjv@crd.ge.com">millerjv@crd.ge.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>





<div>
<div><span><font color="#0000ff" face="Arial" size="2">At 
first glance, the only issue I see is your calculation of the origin.&nbsp; In 
ITK, the origin corresponds to the physical coordinate (mm or ft, etc.) of the 
pixel at index [0, 0, ...].&nbsp; Since your output region starts at a non-zero 
index, you should not need to move the origin.&nbsp; So just copy the origin and 
spacing from the input image to the output image.</font></span></div>
<div><span><font color="#0000ff" face="Arial" size="2"></font></span>&nbsp;</div>
<div><span><font color="#0000ff" face="Arial" size="2">Can 
you describe the &quot;problem&quot; in more detail?&nbsp; How does the output image 
look?</font></span></div>
<div><span><font color="#0000ff" face="Arial" size="2"></font></span>&nbsp;</div>
<div><span><font color="#0000ff" face="Arial" size="2">There 
could be a problem with the ImageFileWriter when the BufferedRegion does not 
start at index [0,0,...].&nbsp; You could place a RegionOfInterestImageFilter 
before the ImageFileWriter (or an ChangeInformationImageFilter) to adjust the 
image so that the BufferedRegion starts at [0,0,...]</font></span></div>
<div><span><font color="#0000ff" face="Arial" size="2"></font></span>&nbsp;</div>
<div><span><font color="#0000ff" face="Arial" size="2">Here 
are the definitions of regions:</font></span></div>
<div><span><font color="#0000ff" face="Arial" size="2"></font></span>&nbsp;</div>
<div><span><font color="#0000ff" face="Arial" size="2">RequestedRegion: How much of the image to process.</font></span></div>
<div><span><font color="#0000ff" face="Arial" size="2">BufferedRegion: How much of the image is in memory.</font></span></div>
<div><span><font color="#0000ff" face="Arial" size="2">LargestPossibleRegion: How big could the image be.&nbsp; 
</font></span></div>
<div><span><font color="#0000ff" face="Arial" size="2"></font></span>&nbsp;</div>
<div><span><font color="#0000ff" face="Arial" size="2">Filters are told to process a RequestedRegion.&nbsp; When a filter runs, 
the RequestedRegion must be a subset of the BufferedRegion. The 
LargestPossibleRegion is typically used to tell whether a pixel is a true 
boundary condition or just a voxel at the edge of 
BufferedRegion.</font></span></div>
<div><span><font color="#0000ff" face="Arial" size="2"></font></span>&nbsp;</div>
<div><span><font color="#0000ff" face="Arial" size="2">Jim</font></span></div></div><div><span class="e" id="q_10b29a75662f0b34_1">
<div><span><font color="#0000ff" face="Arial" size="2"></font></span>&nbsp;</div>

</span></div></div></blockquote></div><br>