<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.apple-style-span
        {mso-style-name:apple-style-span;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Dear Insight Users,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thank you Dawood and David,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Re-reading the material that you advised was useful, and I can now rephrase my question correctly:<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>&#8220;<b>How do I set up boundary conditions for neighbor iterators?&#8221;</b> <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I did find the answer though! I thought that it would be useful to post it here. Perhaps the example codes can be updated? I&#8217;m a bit afraid of messing that up so I leave it to you. In the meantime here is the tricks.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>By default, the boundary conditions are set to Neumann, i.e. the first derivative across the boundary is zero.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>However there are cases where you want a constant boundary, i.e. pad the image with zeros. Then the iterator type should be : <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp; <span style='color:blue'>typedef</span> itk::ConstantBoundaryCondition&lt; ImageType &gt; BoundaryConditionType;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp; <span style='color:blue'>typedef</span> itk::ShapedNeighborhoodIterator&lt; ImageType, BoundaryConditionType &gt; ShapedNeighborhoodIteratorType;</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Now out-of-bounds pixels will return zero.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>For another constant value (such as -1) &nbsp;I use the following:<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp; <span style='color:blue'>typedef</span> itk::ConstantBoundaryCondition&lt; ImageType &gt; BoundaryConditionType;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp; BoundaryConditionType&nbsp; BoundaryCondition ;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp; BoundaryCondition.SetConstant( -<span style='color:#FF8000'>1</span> );</span><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>And later apply it the neighbor iterator:<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp; it.OverrideBoundaryCondition(&amp;BoundaryCondition);<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I hope it helps someone else.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Regards<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hugues.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Dawood Masslawi [mailto:davoud_zzz@yahoo.com] <br><b>Sent:</b> Saturday, 19 March, 2011 14:25<br><b>To:</b> hugues.fontenelle@rr-research.no<br><b>Cc:</b> insight-users@itk.org<br><b>Subject:</b> RE: ShapedNeighborhoodIterator: how to get indexes and how to check bounds?<o:p></o:p></span></p></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0><tr><td valign=top style='padding:0cm 0cm 0cm 0cm'><p class=MsoNormal>Hi Hugues,<o:p></o:p></p><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Welcome to the ITK mailing list :)<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>ImageBoundaryFacesCalculator divides the image into two main regions, boundary and<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>non-boundary. For the non-boundary region no bound checking will be performed and only<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>the pixels in boundary regions are bound checked. You can easily access the pixels in<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>those&nbsp;regions by neighborhood iterators, using the&nbsp;ImageBoundaryFacesCalculator will<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>save you the effort for bound checking. For more information take a look at the following<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>link,<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><a href="http://www.itk.org/Doxygen/html/structitk_1_1NeighborhoodAlgorithm_1_1ImageBoundaryFacesCalculator.html">http://www.itk.org/Doxygen/html/structitk_1_1NeighborhoodAlgorithm_1_1ImageBoundaryFacesCalculator.html</a><o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>The &quot;ci&quot; variable refers to the constant iterator which iterates over the neighborhood<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>defined by the neighborhood iterator and it does not have a GetIndex() method, instead<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>you can get its offset or neighborhood index and find its position relative to the center pixel<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>of the neighborhood. Page 722 of the ITK software guide illustrates how offsets and&nbsp;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>neighborhood indexes are identified relative to the center pixel.<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Hope this helps,<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Dawood<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><pre>Dear all,<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>It is my first post on the list and perhaps my question has already been<o:p></o:p></pre><pre>answered previously, albeit I couldn't find where. I'd be glad if you could<o:p></o:p></pre><pre>help even with a link.<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>I'm implementing a filter similar to the one found in<o:p></o:p></pre><pre>Examples\Iterators\ShapedNeighborhoodIterators1.cxx<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>[1] I understand that the advantage of the<o:p></o:p></pre><pre>NeighborhoodAlgorithm::ImageBoundaryFacesCalculator is to lighten the burden<o:p></o:p></pre><pre>of the algorithm where no check for bounds is necessary.<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>However in the (inner) loop of the ShapedNeighborhoodIterator, no bounds are<o:p></o:p></pre><pre>checked; instead all neighbors are visited (even those falling outside of<o:p></o:p></pre><pre>the image).<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>How can I check for this?<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>[2] In the (inner) loop of the ShapedNeighborhoodIterator, I can get the<o:p></o:p></pre><pre>values of the pixels with ci.Get() .<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>How can I get the indexes? The GetIndex method does not work.<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>Thank you for your time,<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>Hugues<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>Here is my code:<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; typedef itk::ShapedNeighborhoodIterator&lt; ImageType &gt;<o:p></o:p></pre><pre>ShapedNeighborhoodIteratorType;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; ShapedNeighborhoodIteratorType::OffsetType top = {{0,-1}};<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; ShapedNeighborhoodIteratorType::OffsetType bottom = {{0,1}};<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; ShapedNeighborhoodIteratorType::OffsetType left = {{-1,0}};<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; ShapedNeighborhoodIteratorType::OffsetType right = {{1,0}};<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; ShapedNeighborhoodIteratorType::RadiusType radius;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; radius.Fill( 1 );<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; typedef itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator&lt;<o:p></o:p></pre><pre>ImageType &gt; FaceCalculatorType;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; FaceCalculatorType faceCalculator;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; FaceCalculatorType::FaceListType faceList;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; FaceCalculatorType::FaceListType::iterator faceListIterator;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; faceList = faceCalculator( inputImage, inputImage-&gt;GetRequestedRegion(),<o:p></o:p></pre><pre>radius );<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; for ( faceListIterator=faceList.begin(); faceListIterator !=<o:p></o:p></pre><pre>faceList.end(); ++faceListIterator)<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; {<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Face group&quot; &lt;&lt; std::endl;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp; ShapedNeighborhoodIteratorType it( radius, reader-&gt;GetOutput(),<o:p></o:p></pre><pre>*faceListIterator );<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp; for (it.GoToBegin(); !it.IsAtEnd(); ++it)<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp; {<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Centre index: &quot; &lt;&lt; it.GetIndex() &lt;&lt; std::endl;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it.ActivateOffset(top);<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it.ActivateOffset(bottom);<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it.ActivateOffset(left);<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it.ActivateOffset(right);<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShapedNeighborhoodIteratorType::ConstIterator ci;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;&nbsp; Neighbor values: &quot;;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (ci = it.Begin(); ci != it.End(); ci++)<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; ci.Get() &lt;&lt; &quot; &quot;; // All neighbors visited?!?, How to<o:p></o:p></pre><pre>GetIndex() ?!?<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; std::endl;<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp;&nbsp;&nbsp; }<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>&nbsp; }<o:p></o:p></pre></div></td></tr></table><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Calibri","sans-serif"'><o:p>&nbsp;</o:p></span></p></div></body></html>