<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;"><div>Hello ITK users,</div><span id="OLK_SRC_BODY_SECTION"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;"><div><br></div><div>Here is my conversation with '<span style="font-family: Calibri;">Bradley Lowekamp' about the ways to iterate through an image in SimpleITK, since ITK </span>image iterators are not included in SimpleITK interface.</div><div>We were thinking that the question and answers may be helpful to entire community of ITK users.</div><div><br></div><div>Regards,</div><div>Ali</div><div style="font-size: 14px;"><br></div><span id="OLK_SRC_BODY_SECTION" style="font-size: 14px;"><div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt"><span style="font-weight:bold">From: </span>Bradley Lowekamp <<a href="mailto:blowekamp@mail.nih.gov">blowekamp@mail.nih.gov</a>><br><span style="font-weight:bold">Date: </span>Tuesday, August 25, 2015 at 12:02 PM<br><span style="font-weight:bold">To: </span>Ali Ghayoor <<a href="mailto:ali-ghayoor@uiowa.edu">ali-ghayoor@uiowa.edu</a>><br><span style="font-weight:bold">Subject: </span>Re: Iterating through images in SimpleITK<br></div><div><br></div><div><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>This is numpy boadcasting:</div><div><br></div><div><a href="http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html">http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html</a></div><div><br></div><div>Very similar to how to use matlab efficiently. </div><div><br></div><div>From this notebook [1], look at this:</div><div><br></div><div><pre style="padding: 0.2em; font-size: 13px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; margin-top: 0px; margin-bottom: 0px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; background-color: rgb(245, 245, 245); border: none;"><span class="k" style="color: rgb(0, 128, 0); font-weight: bold;">def</span> <span class="nf" style="color: rgb(0, 0, 255);">marschner_lobb</span><span class="p">(</span><span class="n">size</span><span class="o" style="color: rgb(102, 102, 102);">=</span><span class="mi" style="color: rgb(102, 102, 102);">40</span><span class="p">,</span> <span class="n">alpha</span><span class="o" style="color: rgb(102, 102, 102);">=</span><span class="mf" style="color: rgb(102, 102, 102);">0.25</span><span class="p">,</span> <span class="n">f_M</span><span class="o" style="color: rgb(102, 102, 102);">=</span><span class="mf" style="color: rgb(102, 102, 102);">6.0</span><span class="p">):</span>
    <span class="n">img</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">PhysicalPointSource</span><span class="p">(</span> <span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">sitkVectorFloat32</span><span class="p">,</span> <span class="p">[</span><span class="n">size</span><span class="p">]</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="mi" style="color: rgb(102, 102, 102);">3</span><span class="p">,</span> <span class="p">[</span><span class="o" style="color: rgb(102, 102, 102);">-</span><span class="mi" style="color: rgb(102, 102, 102);">1</span><span class="p">]</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="mi" style="color: rgb(102, 102, 102);">3</span><span class="p">,</span> <span class="p">[</span><span class="mf" style="color: rgb(102, 102, 102);">2.0</span><span class="o" style="color: rgb(102, 102, 102);">/</span><span class="n">size</span><span class="p">]</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="mi" style="color: rgb(102, 102, 102);">3</span><span class="p">)</span>
    <span class="n">imgx</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">VectorIndexSelectionCast</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="mi" style="color: rgb(102, 102, 102);">0</span><span class="p">)</span>
    <span class="n">imgy</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">VectorIndexSelectionCast</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="mi" style="color: rgb(102, 102, 102);">1</span><span class="p">)</span>
    <span class="n">imgz</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">VectorIndexSelectionCast</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="mi" style="color: rgb(102, 102, 102);">2</span><span class="p">)</span>
    <span class="k" style="color: rgb(0, 128, 0); font-weight: bold;">del</span> <span class="n">img</span>
    <span class="n">r</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">Sqrt</span><span class="p">(</span><span class="n">imgx</span><span class="o" style="color: rgb(102, 102, 102);">**</span><span class="mi" style="color: rgb(102, 102, 102);">2</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">imgy</span><span class="o" style="color: rgb(102, 102, 102);">**</span><span class="mi" style="color: rgb(102, 102, 102);">2</span><span class="p">)</span>
    <span class="k" style="color: rgb(0, 128, 0); font-weight: bold;">del</span> <span class="n">imgx</span><span class="p">,</span> <span class="n">imgy</span>
    <span class="n">pr</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">Cos</span><span class="p">((</span><span class="mf" style="color: rgb(102, 102, 102);">2.0</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="n">math</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">pi</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="n">f_M</span><span class="p">)</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">Cos</span><span class="p">((</span><span class="n">math</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">pi</span><span class="o" style="color: rgb(102, 102, 102);">/</span><span class="mf" style="color: rgb(102, 102, 102);">2.0</span><span class="p">)</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="n">r</span><span class="p">))</span>
    <span class="k" style="color: rgb(0, 128, 0); font-weight: bold;">return</span> <span class="p">(</span><span class="mf" style="color: rgb(102, 102, 102);">1.0</span> <span class="o" style="color: rgb(102, 102, 102);">-</span> <span class="n">sitk</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">Sin</span><span class="p">((</span><span class="n">math</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">pi</span><span class="o" style="color: rgb(102, 102, 102);">/</span><span class="mf" style="color: rgb(102, 102, 102);">2.0</span><span class="p">)</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="n">imgz</span><span class="p">)</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">alpha</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="p">(</span><span class="mf" style="color: rgb(102, 102, 102);">1.0</span><span class="o" style="color: rgb(102, 102, 102);">+</span><span class="n">pr</span><span class="p">))</span><span class="o" style="color: rgb(102, 102, 102);">/</span><span class="p">(</span><span class="mf" style="color: rgb(102, 102, 102);">2.0</span><span class="o" style="color: rgb(102, 102, 102);">*</span><span class="p">(</span><span class="mf" style="color: rgb(102, 102, 102);">1.0</span><span class="o" style="color: rgb(102, 102, 102);">+</span><span class="n">alpha</span><span class="p">))</span></pre><div><br></div></div><div>This simple computation of a function, could be implemented as a function of XYX. But it's implemented using operations on the whole images. Many algorithms can be structured this way where you might first thing you need the index.</div><div><br></div><div>I don't know what you are trying to do so I can't be more specific.</div><div><br></div><div>Brad</div><div><br></div><div>[1] <a href="http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/20_Expand_With_Interpolators.html">http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/20_Expand_With_Interpolators.html</a></div><div><br></div><div><br></div><div><div>On Aug 25, 2015, at 12:36 PM, Ghayoor, Ali <<a href="mailto:ali-ghayoor@uiowa.edu">ali-ghayoor@uiowa.edu</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Brad,<br><br>
Thank you for your response. I think iterating using the python interface<br>
is the easiest way if you do not need to check the index that you are<br>
operating on at each iteration. In my case, I need to know the index<br>
information at each iteration.<br><br>
Also, I am curious about your suggested fastest way, but I did not quite<br>
understand that. Could you please explain that with a little more details?<br><br>
Thank you,<br>
Ali<br><br><br>
On 8/24/15, 10:09 PM, "Bradley Lowekamp" <<a href="mailto:blowekamp@mail.nih.gov">blowekamp@mail.nih.gov</a>> wrote:<br><br><blockquote type="cite">Hello Ali,<br><br>
As for iterating on SimpleITK image, there is the totally Python<br>
interface to make the Image class iterable [1]. This is as slow as the 3<br>
nested for loop, which is about as slow as iterating on a numpy array.<br>
This is the easiest and most Pythonic way.<br><br>
The fastest way is to reconsider your algorithm to operating on the whole<br>
image/array by using broadcasts and multiplying by 0s and 1s for<br>
conditionals.<br><br>
HTH,<br>
Brad<br><br>
p.s. This kind of question should be directed to the ITK mailing list so<br>
that the entire community can benefit.<br><br><br>
[1] <br><a href="https://github.com/SimpleITK/SimpleITK/blob/6acfc05c01c946316cac9bd8803d62">https://github.com/SimpleITK/SimpleITK/blob/6acfc05c01c946316cac9bd8803d62</a><br>
a4e0cda5b9/Wrapping/Python.i#L289-L310<br><br>
On Aug 24, 2015, at 10:45 PM, Ghayoor, Ali <<a href="mailto:ali-ghayoor@uiowa.edu">ali-ghayoor@uiowa.edu</a>> wrote:<br><br><blockquote type="cite">Hello Brad,<br><br>
I noticed that image iterators are not included in SimpleITK interface, so I needed your<br>
suggestion about the best way to iterate through an image while using<br>
SimpleITK in Ipython notebook. I'm not sure that using three nested<br>
'for' loops is the most efficient way to do that and was thinking maybe<br>
there is a better method.<br><br>
Thank you for your help,<br>
Ali<br></blockquote><br></blockquote><br></blockquote></div><br></div></div></span></div></span></body></html>