[Insight-developers] A possible bug in neighborhood interator
or filter?
Paul Yushkevich
pauly at cognitica . com
Wed, 28 May 2003 14:49:13 -0400
Hi Luis,
I am sorry, I have not communicated very well what I am trying to do.
I have an NxMxK image, which I want to blur with an isotropic Gaussian.
However, I want to see only one slice from the blurred image, i.e., I am
interested in the region R of the output image, located at index 0,X,0
and having size Nx1xK. The computation of R in the output image
requires convolution over the slab-shaped region R* of the input image,
with R* having index 0,X-radius,0 and size Nx(1+2*radius)xK, where
'radius' is the radius of the Gaussian operator. This is quite
different from blurring a NxK two-dimensional slice, which ignores the
adjacent slices.
During PropagateRequestedRegion, DiscreteGaussianImageFilter (DGIF),
correctly computes R* given R. However, in GenerateData, it does not
seem to propagate the region correctly between different stages of
filtering, hence the exception.
Thank you!
Paul.
Luis Ibanez wrote:
> Yeap, my mistake,
>
> I missed the line with the initialization of the region
>
> > ImageRegion<3> region = image->GetLargestPossibleRegion();
>
> Sorry about that,
>
>
> It is likely that the DiscreteGaussian filter will attempt
> to blurr also along the dimension that is 1 pixel wide.
> Since it probably need a minimum number of neighbors, that
> may be triggering the error.
>
> The RecursiveGaussian, for example, will need at least 5
> pixels along each dimension.
>
> In your case you could use two RecursiveGaussian filters
> and explicitly say that you only want to filter along
> dimension 0 and 1. In that way, the fact that the
> third dimension size is 1 will not affect the filtering.
> It will be just like filtering in 2D
>
>
>
> Luis
>
>
> -----------------
> Paul Yushkevich wrote:
>
>> Hi Luis,
>>
>> I believe that the line
>> ImageRegion<3> region = image->GetLargestPossibleRegion();
>>
>> initializes all the components of the region. The subsequent calls
>> to region.SetSize() and region.SetIndex() shrink the region in one of
>> the dimensions to be one pixel thin. When this dimension is in the X
>> axis, everything works, but if it's in a different axis, then the
>> code crashes.
>>
>> What I'm trying to do is to perform only as much blurring as is
>> necessary to produce one slice in the output image.
>>
>> I think that there is some sort of a bug here. The DiscreteGaussian
>> filter chains three Neighborhood filters together, and I think that
>> the regions produced by these filters might not be being calculated
>> correctly. That's my intuition after some debugging.
>>
>> Thank you!
>>
>> Paul
>>
>> Luis Ibanez wrote:
>>
>>> Hi Paul,
>>>
>>> The methods
>>>
>>> SetSize( component, value )
>>> SetIndex( component, value )
>>>
>>> set only one component of the Size/Index.
>>>
>>> In the ImageRegion() default constructor
>>> both m_Size and m_Index are filled up with
>>> zeros.
>>>
>>> In your example, since you are initializing
>>> only the second component of the size, the
>>> first one is still zero. So, you seem to be
>>> asking for a region of size:
>>>
>>> size = (0,1)
>>>
>>> 0 along X
>>> 1 along Y
>>>
>>> Most iterators will be confused with this size.
>>> They expect to have a value of at least 1 along
>>> each dimension.
>>>
>>> It is actually surprising that it works with
>>>
>>> region.SetSize( 0, 1 );
>>>
>>>
>>> You may want to call something like
>>>
>>> region.SetSize(0, sizeX );
>>> region.SetSize(1, sizeY );
>>> region.SetSize(2, sizeZ );
>>>
>>> region.SetIndex(0, indexX );
>>> region.SetIndex(1, indexY );
>>> region.SetIndex(2, indexZ );
>>>
>>>
>>> Since your image is 3D
>>>
>>>
>>>
>>> Luis
>>>
>>>
>>>
>>> -----------------------
>>> Paul Yushkevich wrote:
>>>
>>>> The following code throws an exception in line 36 of
>>>> itkZeroFluxNeumannBoundaryCondition.txx when filter->Update() is
>>>> called.
>>>>
>>>> #include "itkImageFileReader.h"
>>>> #include "itkImage.h"
>>>> #include "itkDiscreteGaussianImageFilter.h"
>>>>
>>>> using namespace itk;
>>>>
>>>> void main(int argc, char *argv[])
>>>> {
>>>>
>>>> // Typedefs
>>>> typedef Image<float,3> ImageType;
>>>> typedef ImageFileReader<ImageType> ReaderType;
>>>> typedef DiscreteGaussianImageFilter<ImageType,ImageType> FilterType;
>>>>
>>>> // Load image
>>>> ReaderType::Pointer reader = ReaderType::New();
>>>> reader->SetFileName("MRIcrop-orig.gipl");
>>>> reader->Update();
>>>> ImageType::Pointer image = reader->GetOutput();
>>>>
>>>> // Create a requested region
>>>> ImageRegion<3> region = image->GetLargestPossibleRegion();
>>>> region.SetIndex(1,55);
>>>> region.SetSize(1,1);
>>>>
>>>> // Create filter
>>>> FilterType::Pointer filter = FilterType::New();
>>>> filter->SetVariance(1.0f);
>>>> filter->SetInput(image);
>>>> filter->GetOutput()->SetRequestedRegion(region);
>>>> filter->Update();
>>>> }
>>>>
>>>> I didn't attach the image because it's a bit large for posting to
>>>> the list. However, it is of sufficient size (78x110x64). It seems
>>>> that the neighborhood iterator jumps outside of bounds, causing the
>>>> exception. The funny thing is that it works with
>>>>
>>>> region.SetIndex(0,55);
>>>> region.SetSize(0,1);
>>>>
>>>> but not with
>>>>
>>>> region.SetIndex(2,55);
>>>> region.SetSize(2,1);
>>>>
>>>> Paul.
>>>>
>>>
>>>
>>>
>>>
>>
>>
>
>
>
>
--
--------------------------------
Paul A. Yushkevich, Ph.D.
President, Cognitica Corporation
17 Flemington Rd
Chapel Hill, NC 27517
Tel: 1-919-929-7652
--------------------------------