contrib/tbl/vepl/vepl_gaussian_convolution.cxx
Go to the documentation of this file.
00001 // This is tbl/vepl/vepl_gaussian_convolution.cxx
00002 #include "vepl_gaussian_convolution.h"
00003 #include <vcl_iostream.h>
00004 #include <vepl/accessors/vipl_accessors_vil_image_view_base.h>
00005 #include <vipl/vipl_gaussian_convolution.h>
00006 #include <vil/vil_image_view.h>
00007 #include <vil/vil_pixel_format.h>
00008 #include <vil/vil_plane.h>
00009 #include <vil/vil_new.h>
00010 #include <vxl_config.h> // for vxl_byte
00011 
00012 vil_image_resource_sptr vepl_gaussian_convolution(vil_image_resource_sptr image, double sigma, double cutoff)
00013 {
00014   vil_image_resource_sptr img_out = vil_new_image_resource(image->ni(), image->nj(), image->nplanes(), image->pixel_format());
00015 
00016   // multi-planar image
00017   // since vipl does not know the concept of planes, run filter on each plane
00018   if (image->nplanes() > 1) {
00019     if (image->pixel_format() == VIL_PIXEL_FORMAT_BYTE) {
00020       vil_image_view<vxl_byte> out = image->get_copy_view();
00021       vil_image_view<vxl_byte> in = image->get_view();
00022       vipl_gaussian_convolution<vil_image_view_base,vil_image_view_base,vxl_byte,vxl_byte> op(sigma, cutoff);
00023       for (unsigned int p=0; p<image->nplanes(); ++p) {
00024         vil_image_view<vxl_byte> i = vil_plane(in,p), o = vil_plane(out,p);
00025         op.put_in_data_ptr(&i); op.put_out_data_ptr(&o); op.filter();
00026       }
00027       img_out->put_view(out);
00028     }
00029     else
00030       vcl_cerr << __FILE__ ": vepl_dilate_disk() not implemented for multi-planar " << image << '\n';
00031   }
00032 
00033   // byte greyscale
00034   else if (image->pixel_format() == VIL_PIXEL_FORMAT_BYTE) {
00035     vil_image_view<vxl_byte> in = image->get_view();
00036     vil_image_view<vxl_byte> out = image->get_copy_view();
00037     vipl_gaussian_convolution<vil_image_view_base,vil_image_view_base,vxl_byte,vxl_byte> op(sigma, cutoff);
00038     op.put_in_data_ptr(&in);
00039     op.put_out_data_ptr(&out);
00040     op.filter();
00041     img_out->put_view(out);
00042   }
00043 
00044   // byte rgb
00045   else if (image->pixel_format() == VIL_PIXEL_FORMAT_RGB_BYTE) {
00046     vil_image_view<vxl_byte> in = image->get_view(); // in will have 3 planes but 1 component
00047     vil_image_view<vxl_byte> out = image->get_copy_view();
00048     vipl_gaussian_convolution<vil_image_view_base,vil_image_view_base,vxl_byte,vxl_byte> op(sigma, cutoff);
00049     op.put_in_data_ptr(&in);
00050     op.put_out_data_ptr(&out);
00051     op.filter();
00052     img_out->put_view(out);
00053   }
00054 
00055   // short
00056   else if (image->pixel_format() == VIL_PIXEL_FORMAT_UINT_16) {
00057     vil_image_view<vxl_uint_16> in = image->get_view();
00058     vil_image_view<vxl_uint_16> out = image->get_copy_view();
00059     vipl_gaussian_convolution<vil_image_view_base,vil_image_view_base,vxl_uint_16,vxl_uint_16> op(sigma, cutoff);
00060     op.put_in_data_ptr(&in);
00061     op.put_out_data_ptr(&out);
00062     op.filter();
00063     img_out->put_view(out);
00064   }
00065 
00066   // int
00067   else if (image->pixel_format() == VIL_PIXEL_FORMAT_UINT_32) {
00068     vil_image_view<vxl_uint_32> in = image->get_view();
00069     vil_image_view<vxl_uint_32> out = image->get_copy_view();
00070     vipl_gaussian_convolution<vil_image_view_base,vil_image_view_base,vxl_uint_32,vxl_uint_32> op(sigma, cutoff);
00071     op.put_in_data_ptr(&in);
00072     op.put_out_data_ptr(&out);
00073     op.filter();
00074     img_out->put_view(out);
00075   }
00076 
00077   // float
00078   else if (image->pixel_format() == VIL_PIXEL_FORMAT_FLOAT) {
00079     vil_image_view<float> in = image->get_view();
00080     vil_image_view<float> out = image->get_copy_view();
00081     vipl_gaussian_convolution<vil_image_view_base,vil_image_view_base,float,float> op(sigma, cutoff);
00082     op.put_in_data_ptr(&in);
00083     op.put_out_data_ptr(&out);
00084     op.filter();
00085     img_out->put_view(out);
00086   }
00087 
00088   // double
00089   else if (image->pixel_format() == VIL_PIXEL_FORMAT_DOUBLE) {
00090     vil_image_view<double> in = image->get_view();
00091     vil_image_view<double> out = image->get_copy_view();
00092     vipl_gaussian_convolution<vil_image_view_base,vil_image_view_base,double,double> op(sigma, cutoff);
00093     op.put_in_data_ptr(&in);
00094     op.put_out_data_ptr(&out);
00095     op.filter();
00096     img_out->put_view(out);
00097   }
00098 
00099   //
00100   else
00101     vcl_cerr << __FILE__ ": vepl_gaussian_convolution() not implemented for " << image << '\n';
00102 
00103   return img_out;
00104 }
00105