<div dir="ltr"><div><div>Thanks again for your comments Matt! As you see, I already &#39;graft&#39; :)<br><br>Based on your comments, I modified my code which got me started. Then using debugger further, I figured out I&#39;d better implementing also VerifyInputInformation() and GenerateInputRequestedRegion(). In outcome, I now do have a working copy. So simple I&#39;ll just share it here. Not sure what happens when region-index is nonzero but for time being its ok.<br>
<br></div>Best,<br></div>-Vaaksiainen<br><br>***<br>template &lt; class TInputImage, class TOutputImage &gt;<br>class ResizeImageFilter : <br>public itk::ImageToImageFilter&lt;TInputImage, TOutputImage&gt;<br>{<br>public:<br>
    typedef ResizeImageFilter Self;<br>    typedef itk::ImageToImageFilter&lt;TInputImage,TOutputImage&gt;    Superclass;<br>    typedef itk::SmartPointer&lt;Self&gt;    Pointer;<br>    typedef typename TInputImage::SpacingType SpacingType;<br>
    typedef typename TOutputImage::SizeType SizeType;<br>    <br>    itkNewMacro( Self );<br>    itkTypeMacro( ResizeImageFilter, itk::ImageToImageFilter );<br>    itkSetMacro( Scale, SpacingType );<br>    itkSetMacro( Size, SizeType );<br>
<br>protected:<br>    ResizeImageFilter()<br>    {<br>        m_Size.Fill( 0 );<br>        m_Scale.Fill( 1 );<br>    }<br>    ~ResizeImageFilter(){}<br>    void VerifyInputInformation() {}<br>    void GenerateData();<br>    void GenerateOutputInformation();<br>
    void GenerateInputRequestedRegion();<br><br>private:<br>    ResizeImageFilter &amp; operator=(const ResizeImageFilter &amp;rhs);<br>    ResizeImageFilter( const ResizeImageFilter &amp;rhs);<br><br>    SpacingType m_Scale;<br>
    SizeType m_Size;<br>    SpacingType m_SpacingActual;<br>    SizeType m_SizeActual;<br>};<br>template &lt; class TInputImage, class TOutputImage &gt;<br>void ResizeImageFilter&lt;TInputImage,TOutputImage&gt;<br>::GenerateData()<br>
{<br>    typedef itk::ResampleImageFilter&lt;TInputImage,TOutputImage,float&gt;    ResamplerType;<br>    ResamplerType::Pointer resampler = ResamplerType::New();<br>    resampler-&gt;SetOutputSpacing( m_SpacingActual );<br>
    resampler-&gt;SetSize( m_SizeActual );<br>    resampler-&gt;SetInput( this-&gt;GetInput() );<br>    resampler-&gt;GraftOutput( this-&gt;GetOutput() );<br>    resampler-&gt;Update();<br>    this-&gt;GraftOutput( resampler-&gt;GetOutput() );<br>
}<br>template &lt; class TInputImage, class TOutputImage &gt;<br>void ResizeImageFilter&lt;TInputImage,TOutputImage&gt;<br>::GenerateInputRequestedRegion()<br>{<br>    this-&gt;itk::ProcessObject::GenerateInputRequestedRegion();<br>
}<br>template &lt; class TInputImage, class TOutputImage &gt;<br>void ResizeImageFilter&lt;TInputImage,TOutputImage&gt;<br>::GenerateOutputInformation()<br>{<br>    const TInputImage * p = this-&gt;GetInput();<br>    if( p )<br>
    {<br>        const unsigned int N = TInputImage::ImageDimension;<br>        double decimation[N];<br>        m_SizeActual = p-&gt;GetRequestedRegion().GetSize();<br>        m_SpacingActual = p-&gt;GetSpacing();<br><br>
        for ( unsigned int n = 0; n &lt; N; ++n )<br>        {<br>            if ( m_Size[n] == 0 ) <br>                decimation[n] = m_Scale[n];<br>            else<br>                decimation[n] = (double)m_Size[n]/(double)m_SizeActual[n];<br>
        }<br>        for ( unsigned int n = 0; n &lt; N; ++n )<br>        {<br>            m_SpacingActual[n] /= decimation[n];<br>            m_SizeActual[n] = (unsigned int)( (double)m_SizeActual[n] * decimation[n] );<br>
            if ( m_SpacingActual[n] &lt;= 0.0 || m_SizeActual[n] == 0 )<br>                itkExceptionMacro(&quot;spacing[n] &lt;= 0 || size[n] == 0&quot; );<br>        }<br>        TOutputImage * pOut = this-&gt;GetOutput();<br>
        if ( pOut )<br>        {<br>            pOut-&gt;CopyInformation( p );<br>            pOut-&gt;SetSpacing( m_SpacingActual );<br>            typename TOutputImage::RegionType region = pOut-&gt;GetRequestedRegion();<br>
            region.SetSize( m_SizeActual );<br>            pOut-&gt;SetLargestPossibleRegion( region );<br>            pOut-&gt;SetSpacing( m_SpacingActual );<br>        }<br>    }<br>}<br>***<br></div><div class="gmail_extra">
<br><br><div class="gmail_quote">2013/10/16 Matt McCormick <span dir="ltr">&lt;<a href="mailto:matt.mccormick@kitware.com" target="_blank">matt.mccormick@kitware.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Vaaksiainen,<br>
<br>
The filter should implement a GenerateOutputInformation() [1] method<br>
that does the size calculation there and assigns it to the output<br>
ImageRegion&#39;s.<br>
<br>
Hope this helps,<br>
Matt<br>
<br>
[1] <a href="http://www.itk.org/Doxygen/html/classitk_1_1ProcessObject.html#abe61fb6b7de8c443e7af1561bd722736" target="_blank">http://www.itk.org/Doxygen/html/classitk_1_1ProcessObject.html#abe61fb6b7de8c443e7af1561bd722736</a><br>

<div><div class="h5"><br>
On Wed, Oct 16, 2013 at 2:42 PM, Vaaksiainen &lt;<a href="mailto:vaaksiainen@gmail.com">vaaksiainen@gmail.com</a>&gt; wrote:<br>
&gt; Thanks for your quick reply, really appreciate.<br>
&gt;<br>
&gt; I could well be using itk::ScaleTransform but I use simply resampling over<br>
&gt; hand written spacing. I think my problem is in fact in pipelining:<br>
&gt;<br>
&gt; void ResampleImageFilterEx&lt;TInputImage,TOutputImage&gt;::GenerateData()<br>
&gt; {<br>
&gt;     //....<br>
&gt;     typename TInputImage::RegionType roi =<br>
&gt; this-&gt;GetOutput()-&gt;GetRequestedRegion();<br>
&gt;     typename TInputImage::SpacingType spacing =<br>
&gt; this-&gt;GetInput()-&gt;GetSpacing();<br>
&gt;     typename TInputImage::SizeType size = roi.GetSize();<br>
&gt;<br>
&gt;     for ( unsigned int i = 0; i &lt; TInputImage::ImageDimension; ++i)<br>
&gt;     {<br>
&gt;         spacing[i] /= m_Decimation;<br>
&gt;         size[i] = (unsigned int)( (double)size[i] * m_Decimation );<br>
&gt;     }<br>
&gt;     itk::ResampleImageFilter&lt;TInputImage,TOutputImage&gt;::Pointer resampler =<br>
&gt;         itk::ResampleImageFilter&lt;TInputImage,TOutputImage&gt;::New();<br>
&gt;<br>
&gt;     resampler-&gt;SetOutputSpacing( inputSpacing );<br>
&gt;     resampler-&gt;SetSize( inputSize );<br>
&gt;     resampler-&gt;SetInput( this-&gt;GetInput() );<br>
&gt;<br>
&gt;     resampler-&gt;GraftOutput( this-&gt;GetOutput() );<br>
&gt;     resampler-&gt;Update();<br>
&gt;     resampler-&gt;GraftOutput( pyrup-&gt;GetOutput() );<br>
&gt; }<br>
&gt;<br>
&gt; but if m_Decimation (or scale parameter) is given as parameter and input yet<br>
&gt; unknown, I can&#39;t get regions propagating correctly. Because eventually I<br>
&gt; want to call Update only for the tail filter.<br>
&gt;<br>
&gt; Best,<br>
&gt; -Vaaksiainen<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; 2013/10/16 Mike Chinander &lt;<a href="mailto:chinander@gmail.com">chinander@gmail.com</a>&gt;<br>
&gt;&gt;<br>
&gt;&gt; Check out the following example:<br>
&gt;&gt; <a href="http://www.itk.org/Wiki/ITK/Examples/ImageProcessing/ScaleTransform" target="_blank">http://www.itk.org/Wiki/ITK/Examples/ImageProcessing/ScaleTransform</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Oct 16, 2013 at 9:10 AM, Vaaksiainen &lt;<a href="mailto:vaaksiainen@gmail.com">vaaksiainen@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Hi folks,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; itk::ResampleImageFilter requires size being set before Update() so far<br>
&gt;&gt;&gt; that I&#39;ve understood it.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; That being said, I&#39;d wish to implement resize image filter (derivative<br>
&gt;&gt;&gt; for before mentioned) which samples the image based on scaling parameter<br>
&gt;&gt;&gt; relative to its input size e.g.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; newWidth = scaling * oldWidth<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; which I figure out at GenerateData() and yet, I&#39;d wish to be able to put<br>
&gt;&gt;&gt; this filter in the pipeline not knowing the size of the input image, e.g.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Reader -&gt; Filter#1 -&gt; ResampleImageFilterEx -&gt; Filter#2 -&gt; Writer<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; How PropagateRequestedRegion() works and how its implemented in<br>
&gt;&gt;&gt; itk::ResampleImageFilter I&#39;m not sure if I can do this at all.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Please, any advice?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Best,<br>
&gt;&gt;&gt; -Vaaksiainen<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _____________________________________<br>
&gt;&gt;&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Visit other Kitware open-source projects at<br>
&gt;&gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt;&gt;&gt; <a href="http://www.kitware.com/products/protraining.php" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt;&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _____________________________________<br>
&gt;&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt;<br>
&gt;&gt; Visit other Kitware open-source projects at<br>
&gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt;<br>
&gt;&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt;&gt; <a href="http://www.kitware.com/products/protraining.php" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
&gt;&gt;<br>
&gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt;<br>
&gt;&gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt; _____________________________________<br>
&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;<br>
&gt; Visit other Kitware open-source projects at<br>
&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>
&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt; <a href="http://www.kitware.com/products/protraining.php" target="_blank">http://www.kitware.com/products/protraining.php</a><br>
&gt;<br>
&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;<br>
&gt; Follow this link to subscribe/unsubscribe:<br>
&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Community mailing list<br>
&gt; <a href="mailto:Community@itk.org">Community@itk.org</a><br>
&gt; <a href="http://public.kitware.com/cgi-bin/mailman/listinfo/community" target="_blank">http://public.kitware.com/cgi-bin/mailman/listinfo/community</a><br>
&gt;<br>
</blockquote></div><br></div>