Hi All,<br>
<br>
I am trying to use BilateralImageFilter to perform the Guassian
operation on the image. When I run the code I am getting some noisy
images. Can any one tell me what's wrong with my code? <br>
<br>
I tried using StatisticsImageFilter to find out the Maximum Intensity
value in the image to rescale the image (Assuming that is causing
noise) It did not give any correction.<br>
<br>
Thanks in advance<br>
Suresh<br>
<br>
<br>
<br>
<br>
/* BilateralImageFilter.cxx (Gaussian smoothing filter )<br>
&nbsp;* Performs smoothing by using both domain and range neighborhoods. Pixels that are close to a<br>
&nbsp;* pixel in the image domain and similar to a pixel in the image range are used to calculate the<br>
&nbsp;* filtered value. Two Gaussian kernels (one in the image domain and one in the image range) are<br>
&nbsp;* used to smooth the image. The result is an image that is smoothed in homogeneous regions yet<br>
&nbsp;* has edges preserved. The result is similar to anisotropic diffusion but the implementation in<br>
&nbsp;* non-iterative. Another benefit to bilateral filtering is that any distance metric can be used<br>
&nbsp;* for kernel smoothing the image range. Bilateral filtering is capable of reducing the noise in<br>
&nbsp;* an image by an order of magnitude while maintaining edges.<br>
&nbsp;*/<br>
<br>
<br>
Here is my code:<br>
==========================================================<br>
#include &quot;itkImage.h&quot;<br>
#include &quot;itkImageFileReader.h&quot;<br>
#include &quot;itkImageFileWriter.h&quot;<br>
#include &quot;itkRescaleIntensityImageFilter.h&quot;<br>
#include &quot;itkBilateralImageFilter.h&quot;<br>
#include &quot;itkCastImageFilter.h&quot;<br>
#include &quot;itkStatisticsImageFilter.h&quot;<br>
<br>
int main( int argc, char * argv[] )<br>
{<br>
&nbsp; if( argc &lt; 5 )<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; argv[0] &lt;&lt; &quot;&nbsp;
inputImageFile&nbsp; outputImageFile&nbsp; domainSigma&nbsp;
rangeSigma&quot; &lt;&lt; std::endl;//using&nbsp;&nbsp; 5.0 &nbsp; &nbsp; 6.0<br>
&nbsp;&nbsp;&nbsp; return 1;<br>
&nbsp; }<br>
<br>
&nbsp; typedef&nbsp;&nbsp;&nbsp; short&nbsp;&nbsp;&nbsp; InputPixelType;<br>
&nbsp; typedef&nbsp;&nbsp;&nbsp; short&nbsp;&nbsp;&nbsp; OutputPixelType;<br>
<br>
&nbsp; typedef itk::Image&lt; InputPixelType,&nbsp; 2 &gt;&nbsp;&nbsp; InputImageType;<br>
&nbsp; typedef itk::Image&lt; OutputPixelType, 2 &gt;&nbsp;&nbsp; OutputImageType;<br>
<br>
&nbsp; typedef itk::ImageFileReader&lt; InputImageType &gt;&nbsp; ReaderType;<br>
<br>
&nbsp; typedef itk::BilateralImageFilter&lt; InputImageType, OutputImageType &gt;&nbsp; FilterType;<br>
&nbsp; FilterType::Pointer filter = FilterType::New();<br>
<br>
&nbsp; typedef itk::CastImageFilter&lt; InputImageType, OutputImageType &gt; CastFilterType;<br>
&nbsp; CastFilterType::Pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
castFilter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = CastFilterType::New();<br>
<br>
&nbsp; typedef itk::StatisticsImageFilter&lt; InputImageType &gt; StatisticsFilterType;<br>
&nbsp; StatisticsFilterType::Pointer statisticsFilter = StatisticsFilterType::New();<br>
<br>
&nbsp; ReaderType::Pointer reader = ReaderType::New();<br>
&nbsp; reader-&gt;SetFileName( argv[1] );<br>
<br>
&nbsp; filter-&gt;SetInput( reader-&gt;GetOutput() );<br>
&nbsp; statisticsFilter-&gt;SetInput( reader-&gt;GetOutput() );<br>
<br>
&nbsp; double maxValue = statisticsFilter-&gt;GetMaximum();<br>
<br>
&nbsp; const unsigned int Dimension = InputImageType::ImageDimension;<br>
&nbsp; double domainSigmas[ Dimension ];<br>
&nbsp; for(unsigned int i=0; i&lt;Dimension; i++)<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; domainSigmas[i] = atof( argv[3] );<br>
&nbsp; }<br>
&nbsp; const double rangeSigma = atof( argv[4] );<br>
<br>
&nbsp; filter-&gt;SetDomainSigma( domainSigmas );<br>
&nbsp; filter-&gt;SetRangeSigma(&nbsp; rangeSigma&nbsp;&nbsp; );<br>
<br>
&nbsp; typedef short WritePixelType;<br>
&nbsp; typedef itk::Image&lt; WritePixelType, 2 &gt; WriteImageType;<br>
&nbsp; typedef itk::RescaleIntensityImageFilter&lt; OutputImageType, WriteImageType &gt; RescaleFilterType;<br>
&nbsp; RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();<br>
<br>
&nbsp; rescaleFilter-&gt;SetOutputMinimum( 0 );<br>
&nbsp; rescaleFilter-&gt;SetOutputMaximum( 1372);&nbsp;&nbsp; //Maximum intensity of the image<br>
<br>
&nbsp; typedef itk::ImageFileWriter&lt; WriteImageType &gt;&nbsp; WriterType;<br>
&nbsp; WriterType::Pointer writer = WriterType::New();<br>
&nbsp; writer-&gt;SetFileName( argv[2] );<br>
<br>
&nbsp; castFilter-&gt;SetInput( filter-&gt;GetOutput() );<br>
&nbsp; rescaleFilter-&gt;SetInput( castFilter-&gt;GetOutput() );<br>
&nbsp; writer-&gt;SetInput( rescaleFilter-&gt;GetOutput() );<br>
&nbsp; writer-&gt;Update();<br>
<br>
&nbsp; return 0;<br>
}<br>
<br>
<br>