[Insight-developers] image information reset by gradient magnitude filter

Bill Lorensen bill.lorensen at gmail.com
Thu Feb 5 10:29:43 EST 2009


Luis,

This error has always been present I believe.

I reproduced the problem using CVS HEAD. I modified the filter's test
by adding non-default image information to the test input. Then, after
the filter runs, I compared the input and output image information.
Before my fix, the information differed. You can duplicate the failure
with my new test, if you comment out my fix (one line) and re-run the
test.

This filter creates an internal image to accumulate results over each
dimension. Since the internal image never copied the image information
from the input image, the internal image had default settings for the
information. This internal image was used as the input to a mini
pipeline. The output of the internal mini-pipeline is grafted onto the
output of the filter.

Note that no tests fail after the error is corrected.

Bill

On Thu, Feb 5, 2009 at 10:18 AM, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>
> Bill,
>
> This is surprising... and worrisome at the same time,
>
> This filter is used in most of the LevelSet examples.
>
> Do we have an idea of when this started failing ?
>
> Also, did you reproduced the problem by using the
> CVS HEAD or by using the ITK 3.10 branch ?
>
>
>   Thanks for any hints,
>
>
>       Luis
>
>
> ---------------------
> Bill Lorensen wrote:
>>
>> Luis,
>>
>> I was able to reproduce the problem. Now it is fixed.
>>
>> Bill
>>
>> On Thu, Feb 5, 2009 at 10:05 AM, Luis Ibanez <luis.ibanez at kitware.com>
>> wrote:
>>
>>> Hi Richard,
>>>
>>> Thanks for the report.
>>>
>>> I couldn't replicate your observation with my build of ITK 3.10.
>>>
>>> When running the example:
>>>
>>>  GradientMagnitudeRecursiveGaussianImageFilter.cxx
>>>
>>> on an image with non-trivial spacing and origin,
>>> I still get that origin and spacing on the output.
>>>
>>>
>>> BTW: Why are you calling Update() in the output of the filter
>>>   instead of calling Update() on the filter itself ?
>>>
>>>
>>> I see that Bill added a test for this issue today,
>>> and committed a change to the filter.
>>>
>>>
>>> Please let us know if that made a difference.
>>>
>>>
>>>  Thanks
>>>
>>>
>>>    Luis
>>>
>>>
>>> -----------------------
>>> Richard Beare wrote:
>>>
>>>> Hi,
>>>> I've come across a strange resetting of image information when using
>>>> the gradient magnitude filter (code below). All spacing and
>>>> orientation information seems to have been reset to default values.
>>>> This is using itk 3.10.1 retrieved using the cvs repository, and the
>>>> cvs head from about 2 weeks ago under linux. I haven't yet checked any
>>>> other filters to see if the problem is more general.
>>>>
>>>> nifti file report from fslhd of input image:
>>>>
>>>> sizeof_hdr     348
>>>> data_type      INT16
>>>> dim0           3
>>>> dim1           256
>>>> dim2           120
>>>> dim3           256
>>>> dim4           1
>>>> dim5           1
>>>> dim6           1
>>>> dim7           1
>>>> vox_units      mm
>>>> time_units     Unknown
>>>> datatype       4
>>>> nbyper         2
>>>> bitpix         16
>>>> pixdim0        0.0000000000
>>>> pixdim1        0.8203120232
>>>> pixdim2        1.1999969482
>>>> pixdim3        0.8203120232
>>>> pixdim4        0.0000000000
>>>> pixdim5        0.0000000000
>>>> pixdim6        0.0000000000
>>>> pixdim7        0.0000000000
>>>> vox_offset     352
>>>> cal_max        0.0000
>>>> cal_min        0.0000
>>>> scl_slope      1.000000
>>>> scl_inter      0.000000
>>>> phase_dim      0
>>>> freq_dim       0
>>>> slice_dim      0
>>>> slice_name     Unknown
>>>> slice_code     0
>>>> slice_start    0
>>>> slice_end      0
>>>> slice_duration 0.000000
>>>> time_offset    0.000000
>>>> intent         Unknown
>>>> intent_code    0
>>>> intent_name
>>>> intent_p1      0.000000
>>>> intent_p2      0.000000
>>>> intent_p3      0.000000
>>>> qform_name     Aligned Anat
>>>> qform_code     2
>>>> qto_xyz:1      -0.820312  -0.000000  -0.000000  105.000000
>>>> qto_xyz:2      0.000000  1.199997  -0.000000  -74.299637
>>>> qto_xyz:3      -0.000000  0.000000  0.820312  -114.179565
>>>> qto_xyz:4      0.000000  0.000000  0.000000  1.000000
>>>> qform_xorient  Right-to-Left
>>>> qform_yorient  Posterior-to-Anterior
>>>> qform_zorient  Inferior-to-Superior
>>>> sform_name     Scanner Anat
>>>> sform_code     1
>>>> sto_xyz:1      -0.820312  -0.000000  0.000000  105.000000
>>>> sto_xyz:2      -0.000000  1.199997  -0.000000  -74.299637
>>>> sto_xyz:3      0.000000  0.000000  0.820312  -114.179565
>>>> sto_xyz:4      0.000000  0.000000  0.000000  1.000000
>>>> sform_xorient  Right-to-Left
>>>> sform_yorient  Posterior-to-Anterior
>>>> sform_zorient  Inferior-to-Superior
>>>> file_type      NIFTI-1+
>>>> file_code      1
>>>> descrip
>>>> aux_file
>>>>
>>>> Result image:
>>>> sizeof_hdr     348
>>>> data_type      INT16
>>>> dim0           3
>>>> dim1           256
>>>> dim2           120
>>>> dim3           256
>>>> dim4           1
>>>> dim5           1
>>>> dim6           1
>>>> dim7           1
>>>> vox_units      mm
>>>> time_units     Unknown
>>>> datatype       4
>>>> nbyper         2
>>>> bitpix         16
>>>> pixdim0        0.0000000000
>>>> pixdim1        1.0000000000
>>>> pixdim2        1.0000000000
>>>> pixdim3        1.0000000000
>>>> pixdim4        0.0000000000
>>>> pixdim5        0.0000000000
>>>> pixdim6        0.0000000000
>>>> pixdim7        0.0000000000
>>>> vox_offset     352
>>>> cal_max        0.0000
>>>> cal_min        0.0000
>>>> scl_slope      1.000000
>>>> scl_inter      0.000000
>>>> phase_dim      0
>>>> freq_dim       0
>>>> slice_dim      0
>>>> slice_name     Unknown
>>>> slice_code     0
>>>> slice_start    0
>>>> slice_end      0
>>>> slice_duration 0.000000
>>>> time_offset    0.000000
>>>> intent         Unknown
>>>> intent_code    0
>>>> intent_name
>>>> intent_p1      0.000000
>>>> intent_p2      0.000000
>>>> intent_p3      0.000000
>>>> qform_name     Aligned Anat
>>>> qform_code     2
>>>> qto_xyz:1      -1.000000  0.000000  0.000000  -0.000000
>>>> qto_xyz:2      0.000000  -1.000000  0.000000  -0.000000
>>>> qto_xyz:3      0.000000  0.000000  1.000000  0.000000
>>>> qto_xyz:4      0.000000  0.000000  0.000000  1.000000
>>>> qform_xorient  Right-to-Left
>>>> qform_yorient  Anterior-to-Posterior
>>>> qform_zorient  Inferior-to-Superior
>>>> sform_name     Scanner Anat
>>>> sform_code     1
>>>> sto_xyz:1      -1.000000  0.000000  0.000000  -0.000000
>>>> sto_xyz:2      0.000000  -1.000000  0.000000  -0.000000
>>>> sto_xyz:3      0.000000  0.000000  1.000000  0.000000
>>>> sto_xyz:4      0.000000  0.000000  0.000000  1.000000
>>>> sform_xorient  Right-to-Left
>>>> sform_yorient  Anterior-to-Posterior
>>>> sform_zorient  Inferior-to-Superior
>>>> file_type      NIFTI-1+
>>>> file_code      1
>>>> descrip
>>>> aux_file
>>>>
>>>> Code:
>>>>
>>>> #include <itkGradientMagnitudeRecursiveGaussianImageFilter.h>
>>>> #include <itkImageFileWriter.h>
>>>> #include <itkImageFileReader.h>
>>>>
>>>>
>>>> template <class TImage>
>>>> void writeIm(typename TImage::Pointer Im, std::string filename)
>>>> {
>>>> typedef typename itk::ImageFileWriter<TImage> WriterType;
>>>> typename WriterType::Pointer writer = WriterType::New();
>>>> writer->SetInput(Im);
>>>> writer->SetFileName(filename.c_str());
>>>> writer->Update();
>>>> }
>>>>
>>>> template <class TImage>
>>>> typename TImage::Pointer readIm(std::string filename)
>>>> {
>>>> typedef typename itk::ImageFileReader<TImage> ReaderType;
>>>> typename ReaderType::Pointer reader = ReaderType::New();
>>>> reader->SetFileName(filename.c_str());
>>>> typename TImage::Pointer result = reader->GetOutput();
>>>> try
>>>>  {
>>>>  result->Update();
>>>>  }
>>>> catch(itk::ExceptionObject &ex)
>>>>  {
>>>>  std::cout << ex << std::endl;
>>>>  std::cout << filename << std::endl;
>>>>  return 0;
>>>>  }
>>>>  result->DisconnectPipeline();
>>>>  return(result);
>>>> }
>>>>
>>>> int main(int argc, char * argv[])
>>>> {
>>>>
>>>> const int dim = 3;
>>>> typedef short PixType;
>>>> typedef itk::Image<PixType, dim> RawImType;
>>>>
>>>> typedef
>>>> itk::GradientMagnitudeRecursiveGaussianImageFilter<RawImType,RawImType>
>>>> GradFiltType;
>>>>
>>>> RawImType::Pointer raw;
>>>> RawImType::Pointer grad;
>>>>
>>>> raw = readIm<RawImType>(argv[1]);
>>>> GradFiltType::Pointer gradfilt = GradFiltType::New();
>>>>
>>>> gradfilt->SetInput(raw);
>>>> gradfilt->SetSigma(0.01);
>>>> grad = gradfilt->GetOutput();
>>>> grad->Update();
>>>> grad->DisconnectPipeline();
>>>> std::cout << raw->GetSpacing() << grad->GetSpacing() << std::endl;
>>>> writeIm<RawImType>(grad, "grad.nii.gz");
>>>>
>>>> return (EXIT_SUCCESS);
>>>> }
>>>> _______________________________________________
>>>> Insight-developers mailing list
>>>> Insight-developers at itk.org
>>>> http://www.itk.org/mailman/listinfo/insight-developers
>>>>
>>>
>>> _______________________________________________
>>> Insight-developers mailing list
>>> Insight-developers at itk.org
>>> http://www.itk.org/mailman/listinfo/insight-developers
>>>
>>
>>
>


More information about the Insight-developers mailing list