[ITK Community] Bug in DefaultVectorPixelAccessor

Matt McCormick matt.mccormick at kitware.com
Tue Mar 11 09:13:20 EDT 2014


Hi Jan,

Another idea is to hold the variable number of iterators in a container
like an std::list, std::map, or std::vector.

HTH,
Matt


On Tue, Mar 11, 2014 at 9:04 AM, Jan Ehrhardt
<ehrhardt at imi.uni-luebeck.de>wrote:

>  Hi Brad,
>
> yes this is an alternative way, but the code inside the loop has approx.
> 200 lines (is quite complicated stuff) and I'm still testing and in your
> solution, I have to maintain the code four times...
>
> Best regards,
> Jan
>
>
> On 03/11/2014 01:55 PM, Bradley Lowekamp wrote:
>
> Hello,
>
>  You are right that the GetPixel methods are slow, but that's why
> iterators are recommended.
>
>  Currently you are trying to have you "if( featureImage2 )" in side the
> per-pixel loop. Not only does this cause you iterator initialization issue
> it also is slower of have this if statement inside the loop.
>
>  Here is an alternative way to construct your logic:
>
>
> https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageFilterBase/include/itkBinaryFunctorImageFilter.hxx#L224-L297
>
>  Hope this help,
> Brad
>
>  On Mar 11, 2014, at 8:34 AM, Jan Ehrhardt <ehrhardt at imi.uni-luebeck.de>
> wrote:
>
>  Hi Matt,
>
> yes, I currently use the ITK iterators, but I have the following problem.
>
> Standard code looks like:
>
> itk::ImageRegionIterator<ImageType1> it( radius, myImage, region );
> itk::ImageRegionIterator<ImageType2> featureIt1( radius, featureImage1,
> region );
> itk::ImageRegionIterator<ImageType3> featureIt2( radius, featureImage2,
> region );
>
> it.GotoBegin();
> featureIt1.GotoBegin();
> featureIt2.GotoBegin();
>
> while(!it.IsAtEnd())
> {
>    // do some complicated processing stuff with or without feature1 and/or
> feature2
>
>   ++it;
>   ++featureIt1;
>   ++featureIt2;
> }
>
> I only know at runtime, whether featureImage1 and/or featureImage2 are
> available. If
> featureImage1 or featureImage2 is NULL, a segmentation fault occurs.
>
> Therefore, I have currently implemented:
>
> itk::ConstNeighborhoodIterator<ImageType1> it( radius, myImage, region );
>
> it.GotoBegin();
>
> while(!it.IsAtEnd())
> {
>    currentIndex=it.GetIndex();
>    if( featureImage1.IsNotNull())
>    {
>         // use featureImage1->GetPixel(currentIndex) to process feature 1
>     }
>     if( featureImage2.IsNotNull())
>    {
>         // use featureImage2->GetPixel(currentIndex) to process feature 2
>    }
>
>    // do some other stuff
>
>   ++it;
> }
>
> The Image::GetPixel() method is quite time-consuming and therefore I look
> for a more efficient method
> to implement this code (without writing four different versions).
>
> Any suggestions?
>
> Best regards,
> Jan
>
> On 03/11/2014 06:12 AM, Matt McCormick wrote:
>
> Hi Jan,
>
>  To iterator through an Image or VectorImage, use the Iterators as
> described in the Software Guide [1]
>
>  HTH,
> Matt
>
>  [1] http://itk.org/ItkSoftwareGuide.pdf
>
>
> On Thu, Mar 6, 2014 at 8:23 AM, Jan Ehrhardt <ehrhardt at imi.uni-luebeck.de>wrote:
>
>> Hi folks,
>>
>> I want to iterate through a vector image without an iterator. My approach
>> was:
>>
>>     MultiChannelImageType::AccessorType accessor =
>> pImage->GetPixelAccessor();
>>     MultiChannelImageType::InternalPixelType* pBuffer =
>> pImage->GetBufferPointer();
>>
>>     for( OffsetValueType i = from; i < to; ++i )
>>     {
>>         vecPixel = accessor.Get(*pBuffer, i);
>>     }
>>
>> but the results are not correct (see bug(?) below). If the bug(?) in
>> DefaultVectorPixelAccessor is corrected ( m_OffsetMultiplier = l ) the
>> behaviour of standard itk iterators change. I assume, I don't understand
>> the parameters of DefaultVectorPixelAccessor::Get() correctly.
>> How can I use the DefaultVectorPixelAccessor correctly?
>>
>> best,
>> jan
>>
>>
>> On 03/06/2014 12:25 PM, Jan Ehrhardt wrote:
>>
>>> Hi folks,
>>>
>>> there is a bug in DefaultVectorPixelAccessor (ITK 4.4.0):
>>>
>>>   void SetVectorLength(VectorLengthType l)
>>>   {
>>>     m_VectorLength = l;
>>>     m_OffsetMultiplier = ( l - 1 );
>>>   }
>>>
>>>   DefaultVectorPixelAccessor(VectorLengthType l)
>>>   {
>>>     m_VectorLength = l;
>>>     m_OffsetMultiplier = l - 1;
>>>   }
>>>
>>> OffsetMultiplier should be m_OffsetMultiplier = l;
>>>
>>> Best regards,
>>> Jan
>>>
>>>
>> _______________________________________________
>> Community mailing list
>> Community at itk.org
>> http://public.kitware.com/cgi-bin/mailman/listinfo/community
>>
>
>
>  _______________________________________________
> Community mailing list
> Community at itk.org
> http://public.kitware.com/cgi-bin/mailman/listinfo/community
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/community/attachments/20140311/a9a1d576/attachment-0002.html>


More information about the Community mailing list