[Insight-users] [ITK Community] MultipleImageIterator

Matt McCormick matt.mccormick at kitware.com
Thu Feb 20 07:29:14 EST 2014


Well done!

On Thu, Feb 20, 2014 at 4:49 AM, Joël Schaerer <joel.schaerer at gmail.com> wrote:
> I made a (tiny) Insight Journal article:
> http://www.insight-journal.org/browse/publication/915
>
> Regarding IsAtEnd(), I decided to handle it differently depending on whether
> or not the code is compiled in debug mode:
> - If compiled in release mode, only the first iterator is checked since the
> multiple iterator is only makes sense if all the iterators have the same
> lenght
> - In debug mode, all iterators are checked and assertions are in place to
> make sure their IsAtEnd() outputs all match.
>
> joel
>
> Le 06/02/2014 18:03, Matt McCormick a écrit :
>
>> Hi Joel,
>>
>> Sounds like an interesting topic for an Insight Journal article [1].
>>
>> An challenge is to handle IsAtEnd().  In your example !it[0].IsAtEnd()
>> is applied, which may be appropriate for some cases.  In other cases,
>> the iterators may complete at different points. Something to think
>> about ...
>>
>> Thanks,
>> Matt
>>
>> [1] http://insight-journal.org/
>>
>> On Thu, Feb 6, 2014 at 5:54 AM, Joël Schaerer <joel.schaerer at gmail.com>
>> wrote:
>>>
>>> Hi all,
>>>
>>> Recently I've had to iterate over many images at the same time. Instead
>>> of
>>> mixing the tedious iterator housekeeping code with the algorithm, I
>>> thought
>>> it could be a good idea to have a "multiple image iterator" for that.
>>> Since
>>> I didn't find one in ITK, I started writing a simple one myself. Its main
>>> limitation is that all iterators and thus all images must be of the same
>>> type:
>>>
>>> namespace itk {
>>> template<typename TIterator>
>>> class MultipleImageIterator {
>>> public:
>>>    typedef MultipleImageIterator Self;
>>>    typedef TIterator IteratorType;
>>>    typedef typename IteratorType::ImageType ImageType;
>>>    IteratorType& operator[](const int i) {return m_iterators[i];}
>>>    void AddIterator(const IteratorType& it) {m_iterators.push_back(it);}
>>>    Self& operator++() {
>>>      for (typename std::vector<IteratorType>::iterator it =
>>> m_iterators.begin();
>>>        it != m_iterators.end(); ++it) {
>>>        ++(*it);
>>>      }
>>>    }
>>>    void GoToBegin() {
>>>      for (typename std::vector<IteratorType>::iterator it =
>>> m_iterators.begin();
>>>        it != m_iterators.end(); ++it) {
>>>        it->GoToBegin();
>>>      }
>>>    }
>>>    unsigned int Size () const { return m_iterators.size(); }
>>> protected:
>>>    std::vector<IteratorType> m_iterators;
>>>
>>> };
>>> }
>>>
>>> Here is a pretty straightforward usage example, which prints the values
>>> of 4
>>> images side by side:
>>>
>>> int main()
>>> {
>>>    typedef itk::Image<float,3> ImageType;
>>>    typedef itk::ImageFileReader<ImageType> ReaderType;
>>>
>>>    typedef itk::ImageRegionIterator<ImageType> IteratorType;
>>>    itk::MultipleImageIterator<IteratorType> it;
>>>
>>>    std::string filenames[] =
>>> {"originalT1.mha","csf_reg.nii.gz","grey_reg.nii.gz","white_reg.nii.gz"};
>>>    std::vector<ImageType::Pointer> images; // Need to keep a reference as
>>> iterators only have weak references
>>>    ReaderType::Pointer r = ReaderType::New();
>>>    for (unsigned int i=0; i<4;++i) {
>>>      r->SetFileName(filenames[i]);
>>>      r->Update();
>>>      ImageType::Pointer im = r->GetOutput();
>>>      im->DisconnectPipeline();
>>>      images.push_back(im);
>>>
>>> it.AddIterator(itk::ImageRegionIterator<ImageType>(im,im->GetLargestPossibleRegion()));
>>>    }
>>>
>>>    for (it.GoToBegin(); !it[0].IsAtEnd(); ++it) {
>>>      if ((it[1].Get() != 0) && ((float)std::rand()) / RAND_MAX < 0.01) {
>>>        for (unsigned int i=0; i<it.Size(); ++i) {
>>>          std::cout << it[i].Get() << ";";
>>>        }
>>>        std::cout << std::endl;
>>>      }
>>>    }
>>> }
>>>
>>>
>>> Any comments? What is the usual way of doing this with ITK? If there is
>>> any
>>> interest, this could be improved and potentially included in the library.
>>>
>>> joel
>>> _____________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Kitware offers ITK Training Courses, for more information visit:
>>> http://www.kitware.com/products/protraining.php
>>>
>>> Please keep messages on-topic and check the ITK FAQ at:
>>> http://www.itk.org/Wiki/ITK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.itk.org/mailman/listinfo/insight-users
>>> _______________________________________________
>>> Community mailing list
>>> Community at itk.org
>>> http://public.kitware.com/cgi-bin/mailman/listinfo/community
>
>


More information about the Insight-users mailing list