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