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