[Insight-users] Anisotropic Diffusion filtering

rashedk rashed.vtk at googlemail.com
Fri Aug 10 22:14:32 EDT 2007


Hi Luis, 

Thanks for your email. I managed to extract a slice of my 3D volume using
some other application. Now I am back to my old problem where I am trying to
find the right parameters for the Anisotropic filtering. 

As you had previously suggested, I have hosted them on to a public site (my
data). You can download this at: http://www.doc.ic.ac.uk/~rkarim/slice.zip

So the data is in the Analyze format, and the data is just a single slice of
my MRA image of the left atrium. 

Thanks for your help. I really appreciate. 

Regards,
Rashed karim 



Luis Ibanez wrote:
> 
> 
> Hi Rashed,
> 
> That sounds indeed like a bug...
> 
> but before we go there:
> 
> 1) Why are you setting explicitly the ImageIO in the Reader and Writer ?
>     The filename extension of GIPL files should be enough for letting the
>     IO factory find the appropriate ImageIO class.
> 
> 2) Where you getting any error messages when not setting
>     the ImageIO directly ?
> 
> 3) Now that you add the ImageIO, do you get any error messages ?
> 
> 
>    Thanks
> 
> 
>       Luis
> 
> 
> ------------------
> rashedk wrote:
>> Hi Luis, 
>> 
>> Thanks for your reply. I am working with GIPL images, and so after you
>> asked
>> me to test the anisotropic filter with a single slice of my image, I
>> started
>> trying to use the ExtractImageFilter to extract a slice. So to read and
>> write GIPL images by setting ImageIO explicitly: 
>> 
>> typedef itk::GiplImageIO ImageIOType; 
>> ImageIOType::Pointer giplIO = ImageIOType::New(); 
>> reader->SetImageIO(giplIO); 
>> writer->SetImageIO(giplIO); 
>> 
>> I am not able to extract a slice of my image (after adding these lines to
>> the example code of ExtractImageFilter). Now I am getting the feeling
>> that
>> perhaps there are some issues with GIPL Input/Output in ITK?? 
>> 
>> However, i have tested flushing a GIPL reader's output to a GIPL writer's
>> input without a filter in between, and that works perfectly fine. 
>> 
>> 
>> 
>> 
>> 
>> Luis Ibanez wrote:
>> 
>>>
>>>Hi Rashed,
>>>
>>>
>>>
>>>  1) Could you post somewhere in a public web site
>>>     a slice of one of your 3D images ?
>>>
>>>
>>>  2) The numerical values recommended for the parameters
>>>     of this filter, are for a typical MRI image.
>>>
>>>     If your images happen to have a very different
>>>     appearance then you need to explore different settings
>>>     for the parameters.
>>>
>>>     I would strongly suggest you to do this first in a single
>>>     slice of the 3D image (use the ExtractImageFilter), since
>>>     it will be a lot faster to try many different combinations
>>>     of the filter parameters.
>>>
>>>
>>>  3) 50 iterations, should be more than enough for producing
>>>     a visible effect in the images... unless your images are
>>>     very particular,
>>>
>>>     What is the modality of your images ? (CT? MRI? Ultrasound ?)
>>>     What is the content of the image ? brain?, liver?
>>>
>>>
>>>  4) The time step should be small. The critical values are in the
>>>     order of 0.625. Whenever you go higher than that the filter
>>>     becomes numerically unstable. You should probably stay below
>>>     half that value, just to be safe.
>>>
>>>     Note however, that there is a relationship between the time
>>>     step and the number of iterations. After all, this filter is
>>>     simulating the melting of the material in your image as if it
>>>     were a physical problem. This is a discretization of a continuous
>>>     physical model. If you use half of the time steps, you will need
>>>     double the iterations in order to cover the same process.
>>>
>>>     That being said, this is just a simile, there is no real melting
>>>     happening here, so you simply use the physical model as an analogy
>>>     for smoothing the image.
>>>
>>>
>>>  5) A Gaussian smoothing of 20-30 is *HUGE*.
>>>
>>>     What specific filter did you use for the smoothing ?
>>>     What is the pixel spacing of your images ?
>>>
>>>
>>>
>>>  Please give us more information,
>>>
>>>
>>>     Thanks
>>>
>>>
>>>        Luis
>>>
>>>
>>>---------------------
>>>rashed karim wrote:
>>>
>>>>Hi everyone,
>>>> 
>>>>I am trying to use the itkGradientAnisotropicDiffusionImageFilter class 
>>>>for smoothing my MRI images. To my dismay, my images are not responding 
>>>>to the filter even when I run 50 or so iterations with a conductance of 
>>>>about 3.0 (i.e. output image is the same as the input image with no 
>>>>visible difference). An earlier forum post had suggested to use a 3.0 
>>>>conductance level, but such a high conductance rate makes the 
>>>>output image unrecognizable (lots of salt-pepper noise).
>>>> 
>>>>So has anyone used this filter before, and if so, what sort of 
>>>>parameter values (number of iterations, conductance and time step) 
>>>>should I be looking to use. Although I know that these values depend 
>>>>on the type of my images I am working with, but any suggestions will be 
>>>>very useful.
>>>> 
>>>>Also in the documentation it says somewhere that the time step parameter 
>>>>is similar to the width of the gaussian kernel. I have tried values of 
>>>>20.0 - 30.0. However, I get a warning message telling me that this sort 
>>>>of value is an "unstable time step" for my images. The message also 
>>>>suggests a timestep which is usually a very small value (~ 0.05). What i 
>>>>dont understand, is that I had no problems (isotropic) 
>>>>Gaussian smoothing my images with widths ranging from 20.0 - 30.0, then 
>>>>why does the anisotropic filter complain for such widths?
>>>> 
>>>>Here is part of my code if it helps:
>>>> 
>>>> typedef itk::Image< PixelType, 3 > InputImageType;
>>>> typedef itk::Image< PixelType, 3 > OutputImageType;
>>>> typedef itk::ImageFileReader< InputImageType > ReaderType;
>>>> typedef itk::ImageFileWriter< OutputImageType >  WriterType;
>>>> typedef itk::GiplImageIO ImageIOType;
>>>> typedef itk::GradientAnisotropicDiffusionImageFilter<InputImageType, 
>>>>OutputImageType > FilterType;
>>>> 
>>>>
>>>> ReaderType::Pointer reader = ReaderType::New();
>>>> WriterType::Pointer writer = WriterType::New();
>>>> ImageIOType::Pointer giplIO = ImageIOType::New();
>>>> FilterType::Pointer filter = FilterType::New();
>>>>
>>>> reader->SetFileName( argv[1] );
>>>> writer->SetFileName( argv[2] );
>>>> 
>>>> 
>>>> // for GIPL files
>>>> reader->SetImageIO(giplIO);
>>>> writer->SetImageIO(giplIO);
>>>> 
>>>> //reader->Update();
>>>> 
>>>> writer->SetInput(filter->GetOutput());
>>>> filter->SetInput(reader->GetOutput());
>>>> filter->SetNumberOfIterations( numberOfIterations );
>>>> filter->SetTimeStep( timeStep );
>>>> filter->SetConductanceParameter( conductance );
>>>> writer->Update();
>>>>
>>>>Thanks for any suggestions,
>>>>
>>>> 
>>>>
>>>>Regards,
>>>>
>>>>Rashed Karim.
>>>>
>>>>
>>>>------------------------------------------------------------------------
>>>>
>>>>_______________________________________________
>>>>Insight-users mailing list
>>>>Insight-users at itk.org
>>>>http://www.itk.org/mailman/listinfo/insight-users
>>>
>>>_______________________________________________
>>>Insight-users mailing list
>>>Insight-users at itk.org
>>>http://www.itk.org/mailman/listinfo/insight-users
>>>
>>>
>> 
>> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
> 
> 

-- 
View this message in context: http://www.nabble.com/Anisotropic-Diffusion-filtering-tf4199946.html#a12101878
Sent from the ITK - Users mailing list archive at Nabble.com.



More information about the Insight-users mailing list