[ITK Community] Bug in DefaultVectorPixelAccessor
Jan Ehrhardt
ehrhardt at imi.uni-luebeck.de
Tue Mar 11 10:54:22 EDT 2014
Hi Brad, hi Matt,
thanks! That is a very good solution. I did not realize that an
operator= does the job and I assumed
it=ImageRegionIterator(myfeatureImage2, region) will not work. Sorry.
So, this is the solution for my problem. Thanks to all for your help.
To come back to my initial post about the DefaultVectorPixelAccessor. I
think, the documentation of this class should be improved to avoid
confusion about the parameters of the Get() and Set() method. As far as
I see, the correct way to access an vector at a pixel offset is not
intuitive:
accessor.Get(*(pBuffer+offset), offset);
Best regards,
Jan
On 03/11/2014 02:18 PM, Bradley Lowekamp wrote:
> OK,
>
> Then another approach is to take advantage that the iterators are
> default constructible. Something like this:
>
> ImageRegionIterator it2;
> if (myfeatureImage2)
> {
> it = ImageRegionIterator(myfeatureImage2, region);
> }
>
> There are a lot of options.
>
> Hope one works for you,
> Brad
>
> On Mar 11, 2014, at 9:04 AM, Jan Ehrhardt <ehrhardt at imi.uni-luebeck.de
> <mailto: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 <mailto: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 <mailto: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 <mailto:Community at itk.org>
>>>>> http://public.kitware.com/cgi-bin/mailman/listinfo/community
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> Community mailing list
>>>> Community at itk.org <mailto: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/48bec47f/attachment-0002.html>
More information about the Community
mailing list