Image Component Library (ICL)
|
Class that provides median filter abilities . More...
#include <MedianOp.h>
Public Member Functions | |
MedianOp (const utils::Size &maskSize) | |
Constructor that creates a median filter object, with specified mask size. More... | |
void | apply (const core::ImgBase *poSrc, core::ImgBase **ppoDst) |
applies the median operation on poSrc and stores the result in poDst More... | |
virtual utils::Size | adaptSize (const utils::Size &size) |
ensures that mask width and height are odd More... | |
Public Member Functions inherited from icl::filter::NeighborhoodOp | |
virtual | ~NeighborhoodOp () |
Destructor. More... | |
bool | computeROI (const core::ImgBase *poSrc, utils::Point &oROIoffset, utils::Size &oROIsize) |
compute neccessary ROI offset and size More... | |
virtual void | applyMT (const core::ImgBase *operand1, core::ImgBase **dst, unsigned int nThreads) |
NEW apply function for multithreaded filtering (reimplemented here for special roi handling!) More... | |
const utils::Size & | getMaskSize () const |
const utils::Point & | getAnchor () const |
const utils::Point & | getROIOffset () const |
virtual void | apply (const core::ImgBase *operand1, core::ImgBase **dst)=0 |
Import unaryOps apply function without destination image. More... | |
virtual const core::ImgBase * | apply (const core::ImgBase *src) |
Import unaryOps apply function without destination image. More... | |
Public Member Functions inherited from icl::filter::UnaryOp | |
UnaryOp () | |
Explicit empty constructor. More... | |
UnaryOp (const UnaryOp &other) | |
Explicit copy constructor. More... | |
UnaryOp & | operator= (const UnaryOp &other) |
Explicit declaration of the assignment operator. More... | |
virtual | ~UnaryOp () |
Destructor. More... | |
virtual const core::ImgBase * | apply (const core::ImgBase *src) |
applys the filter usign an internal buffer as output image More... | |
void | operator() (const core::ImgBase *src, core::ImgBase **dst) |
function operator (alternative for apply(src,dst) More... | |
const core::ImgBase * | operator() (const core::ImgBase *src) |
function operator for the implicit destination apply(src) call More... | |
const core::ImgBase & | operator() (const core::ImgBase &src) |
reference based function operator More... | |
void | setClipToROI (bool bClipToROI) |
sets if the image should be clip to ROI or not More... | |
void | setCheckOnly (bool bCheckOnly) |
sets if the destination image should be adapted to the source, or if it is only checked if it can be adapted. More... | |
bool | getClipToROI () const |
returns the ClipToROI status More... | |
bool | getCheckOnly () const |
returns the CheckOnly status More... | |
virtual void | setPropertyValue (const std::string &propertyName, const utils::Any &value) |
sets value of a property (always call call_callbacks(propertyName) or Configurable::setPropertyValue) More... | |
Public Member Functions inherited from icl::utils::Configurable | |
virtual | ~Configurable () |
virtual destructor More... | |
Configurable (const Configurable &other) | |
Copy constructor. More... | |
Configurable & | operator= (const Configurable &other) |
Assignment operator. More... | |
void | setConfigurableID (const std::string &ID) |
sets the ID of this configurable More... | |
const std::string & | getConfigurableID () const |
returns the configurables static ID More... | |
bool | isOrderedFlagSet () const |
returns whether the ordered flag is set More... | |
void | deactivateProperty (const std::string &pattern) |
adds an additional deativation pattern More... | |
void | deleteDeactivationPattern (const std::string &pattern) |
removed a formerly added deactivation pattern More... | |
std::vector< std::string > | getPropertyListWithoutDeactivated () const |
this returns a filtered list of properties (using all filters added by deactivateProperty) More... | |
virtual void | adaptProperty (const std::string &name, const std::string &newType, const std::string &newInfo, const std::string &newToolTip) |
this function can be used to adapt a specific property afterwards More... | |
void | registerCallback (const Callback &cb) |
add a callback for changed properties More... | |
void | removedCallback (const Callback &cb) |
removes a callback that was registered before More... | |
void | syncChangesTo (Configurable *others, int num=1) |
this can be used to let this instance also apply property changes to others More... | |
virtual std::vector< std::string > | getPropertyList () const |
returns a list of All properties, that can be set using setProperty More... | |
virtual bool | supportsProperty (const std::string &propertyName) const |
base implementation for property check (seaches in the property list) More... | |
virtual void | saveProperties (const std::string &filename, const std::vector< std::string > &propertiesToSkip=EMPTY_VEC) const |
writes all available properties into a file More... | |
virtual void | loadProperties (const std::string &filename, const std::vector< std::string > &propertiesToSkip=EMPTY_VEC) |
reads a camera config file from disc More... | |
virtual std::string | getPropertyType (const std::string &propertyName) const |
get type of property More... | |
virtual std::string | getPropertyInfo (const std::string &propertyName) const |
get information of a properties valid values More... | |
virtual Any | getPropertyValue (const std::string &propertyName) const |
returns the current value of a property or a parameter More... | |
virtual std::string | getPropertyToolTip (const std::string &propertyName) const |
returns the tooltip description for a given property More... | |
virtual int | getPropertyVolatileness (const std::string &propertyName) const |
Returns whether this property may be changed internally. More... | |
Additional Inherited Members | |
Public Types inherited from icl::utils::Configurable | |
typedef Function< void, const Property & > | Callback |
Function type for changed properties. More... | |
Static Public Member Functions inherited from icl::filter::UnaryOp | |
static UnaryOp * | fromString (const std::string &definition) |
Creates a UnaryOp instance from given string definition. More... | |
static std::string | getFromStringSyntax (const std::string &opSpecifier) |
gives a string syntax description for given opSpecifier More... | |
static std::vector< std::string > | listFromStringOps () |
returns a list of all supported OP_SPEC values for the fromString function More... | |
static void | applyFromString (const std::string &definition, const core::ImgBase *src, core::ImgBase **dst) |
creates, applies and releases a UnaryOp defined by given definition string More... | |
Static Public Member Functions inherited from icl::utils::Configurable | |
static std::string | create_default_ID (const std::string &prefix) |
this function can be used in subclasses to create a default ID More... | |
static Configurable * | get (const std::string &id) |
returns configurable by given ID More... | |
static void | register_configurable_type (const std::string &classname, Function< Configurable * > creator) |
registers a configurable type More... | |
static std::vector< std::string > | get_registered_configurables () |
returns a list of all registered configurable classnames More... | |
static Configurable * | create_configurable (const std::string &classname) |
creates a configurable by given name More... | |
Static Public Attributes inherited from icl::utils::Configurable | |
static const std::vector< std::string > | EMPTY_VEC |
used as shortcut – just an empty vector of std::strings More... | |
Protected Member Functions inherited from icl::filter::NeighborhoodOp | |
NeighborhoodOp () | |
NeighborhoodOp (const utils::Size &size) | |
void | setMask (const utils::Size &size) |
void | setMask (const utils::Size &size, const utils::Point &anchor) |
void | setROIOffset (const utils::Point &offs) |
virtual bool | prepare (core::ImgBase **ppoDst, const core::ImgBase *poSrc) |
prepare filter operation: ensure compatible image format and size More... | |
virtual bool | prepare (core::ImgBase **ppoDst, const core::ImgBase *poSrc, core::depth eDepht) |
prepare filter operation: as above, but with depth parameter More... | |
Protected Member Functions inherited from icl::filter::UnaryOp | |
bool | prepare (core::ImgBase **ppoDst, core::depth eDepth, const utils::Size &imgSize, core::format eFormat, int nChannels, const utils::Rect &roi, utils::Time timestamp=utils::Time::null) |
Protected Member Functions inherited from icl::utils::Configurable | |
void | addProperty (const std::string &name, const std::string &type, const std::string &info, const Any &value=Any(), const int volatileness=0, const std::string &tooltip=std::string()) |
This can be used by derived classes to store supported properties in the internal list. More... | |
void | addChildConfigurable (Configurable *configurable, const std::string &childPrefix="") |
This adds another configurable as child. More... | |
void | removeChildConfigurable (Configurable *configurable) |
removes the given child configurable More... | |
Property & | prop (const std::string &propertyName) |
this CAN be used e.g. to store a property value in internal property-list More... | |
const Property & | prop (const std::string &propertyName) const |
this CAN be used e.g. to store a property value in internal property-list More... | |
Configurable (const std::string &ID="", bool ordered=true) | |
create this configurable with given ID More... | |
void | call_callbacks (const std::string &propertyName, const Configurable *caller) const |
calls all registered callbacks More... | |
Protected Attributes inherited from icl::filter::NeighborhoodOp | |
utils::Size | m_oMaskSize |
TODO: later private with getter and setter functions. More... | |
utils::Point | m_oAnchor |
anchor of filter mask More... | |
utils::Point | m_oROIOffset |
to-be-used ROI offset for source image More... | |
Protected Attributes inherited from icl::filter::UnaryOp | |
utils::MultiThreader * | m_poMT |
Protected Attributes inherited from icl::utils::Configurable | |
std::vector< Callback > | callbacks |
internally managed list of callbacks More... | |
Class that provides median filter abilities .
The median class provides the ability for arbitrary mask sizes. Although the functionality of the IPP-optimized implementation and the fallback C++-implementation is identical, the performances are of different orders of magnitude. Fallback-functions for masks with dimensions 3x3 and 5x5 are optimizied with SSE-instructions, but the computation time for images of types Img8u and Img16s is still greater than the one of IPP-implementations. However SSE-implementations show a better performance for the type icl32f. Here the algorithm just takes the median using min and max functions. Images of the type Img8u and Img16s with other mask sizes are processed by the algorithm, that was introduced by Thomas S. Huang. With the help of a histogram the algorithm runs in O(n). For all other types a trivial implementation was designed to calculate the median values. It uses the naive algorithm of sorting all N pixel values inside the median mask, and setting the destination pixel value to the mid-element of the sorted pixel list. This algorithm runs in O(w*h*N*log(N)) where (w,h) is the size of source images ROI, and N=n*n is the mask size used. The following code extract explains the operation of the fallback algorithm in Img-style notation for a single channel image, and Img8u type (the real implementation uses some special optimizations, that are not mentioned further):
void channel_median_8u(Img8u &src, Img8u &dst, int w, int h, int c) { std::vector<icl8u> list;
for(Img8u::iterator s=src.begin(c), d=dst.begin(c); s.inRegion() ; s++, d++ ) { for(Img8u::iterator sR(s,w,h); sR.inRegion(); sR++) { list.push_back(*sR); } std::sort(list.begin(),list.end()); *d = list[w*h/2]; list.clear(); } }
The IPP implementation uses a fast median algorithm that estimates the median not by sorting a list, but by working on a histogram. Look at the IPPI manual for more detail.
Currently the IPP implementation of 2D-median filtering for Ipp32f type is slower than the C++-implementation, so the C++-fallback is always used then.
Although the fallback C++ implementation can work with arbitrary mask sizes, the Median will internally use odd mask dimension like 3x3 or 5x7. If an even width or height parameter is given to the Median constructor, the next higher odd value is used.
3x3 | 5x5 | 51x51 | 51x3 | 3x51 | |
icl8u, ipp | ~1.8ms | ~2.6ms | ~292ms | ~32.4ms | ~328ms |
icl8u, c++ | ~2.6ms | ~11.7ms | ~323ms | ~350ms | ~47ms |
icl16s, ipp | ~2.7ms | ~4ms | ~21100ms | ~338ms | ~420ms |
icl16s, c++ | ~4.2ms | ~16.2ms | ~370ms | ~384ms | ~90ms |
float, ipp | ~25ms | ~257ms | ~?ms | ~52000ms | ~49000ms |
float, c++ | ~11.6ms | ~39ms | ~217000ms | ~8700ms | ~8700ms |
Here is an examle, how to use the Median object.
// create source and destination image Img8u src(640,480,3), *poDst=0;
// acquire some image data ...
// create the median object Median m(Size(5,5));
// apply the median on the images - first call (slow) // destination image is renewed to 640x480x3 (memory allocation) m.apply(&src,&poDst);
// enter iteration loop while(1) { // aquire some new image data ...
// apply the median filter (now fast, as no memory // allocation must be performed) m.apply(&src,&poDst);
// further processing steps ... }
|
inline |
Constructor that creates a median filter object, with specified mask size.
maskSize | of odd width and height Even width or height is increased to next higher odd value. |
|
inlinevirtual |
ensures that mask width and height are odd
This is a workaround, necessary because of an ipp Bug that allows no even mask sizes here!
size | size to adjust |
Reimplemented from icl::filter::NeighborhoodOp.
|
virtual |
applies the median operation on poSrc and stores the result in poDst
The depth, channel count and size of poDst is adapted to poSrc' ROI:
poSrc | source image |
ppoDst | pointer to destination image |
Implements icl::filter::UnaryOp.