scalespace.h implements a Gaussian scale space, a data structure representing an image at multiple resolutions [witkin83scale-space]} [koenderink84the-structure]} [lindeberg94scale-space]}. Scale spaces have many use, including the detection of co-variant local features [lindeberg98principles]} such as SIFT, Hessian-Affine, Harris-Affine, Harris-Laplace, etc. Getting started demonstreates how to use the C API to compute the scalespace of an image. For further details refer to:
Given an input image `image`, the following example uses the VlScaleSpace object to compute its Gaussian scale space and return the image `level` at scale `(o,s)`, where `o` is the octave and `s` is the octave subdivision or sublevel:
float* level ; VlScaleSpace ss = vl_scalespace_new(imageWidth, imageHeight) ; vl_scalespace_put_image(ss, image) ; level = vl_scalespace_get_level(ss, o, s) ;
The image `level` is obtained by convolving `image` by a Gaussian filter of isotropic standard deviation given by
double sigma = vl_scalespace_get_sigma(ss, o, s) ;
The resolution of `level` is in general different from the resolution of `image` and is determined by the octave `o`. It can be obtained as follows:
VlScaleSpaceOctaveGeometry ogeom = vl_scalespace_get_octave_geometry(ss, o) ; ogeom.width // width of level (in number of pixels) ogeom.height // height of level (in number of pixels) ogeom.step // spatial sampling step
The parameter `ogeom.step` is the sampling step relatively to the sampling of the input image `image`. The ranges of valid octaves and scale sublevels can be obtained as
VlScaleSpaceGeometry geom = vl_scalespace_get_geometry(ss) ; geom.firstOctave // Index of the fisrt octave geom.lastOctave // Index of the last octave geom.octaveResolution ; // Number of octave subdivisions geom.octaveFirstSubdivision // Index of the first octave subdivision geom.octaveLastSubdivision // Index of the last octave subdivision
So for example `o` minimum value is `geom.firstOctave` and maximum value is `geom.lastOctave`. The subdivision index `s` naturally spans the range 0 to `geom.octaveResolution-1`. However, the scale space object is flexible in that it allows different ranges of subdivisions to be computed and `s` varies in the range `geom.octaveFirstSubdivision` to `geom.octaveLastSubdivision`. See Gaussian scale space fundamentals for further details.
The geometry of the scale space can be customized upon creation, as follows:
VlScaleSpaceGeometry geom = vl_scalespace_get_default_geometry(imageWidth, imageHeight) ; geom.firstOctave = -1 ; geom.octaveFirstSubdivision = -1 ; geom.octaveLastSubdivision = geom.octaveResolution ; VlScaleSpacae ss = vl_scalespace_new_with_geometry (geom) ;