Image Component Library (ICL)
Classes | Public Member Functions | Private Attributes | List of all members
icl::filter::LUTOp3Channel< T > Class Template Reference

class for applying table look-up transformation to 3-channel integer-valued images More...

#include <LUTOp3Channel.h>

Inheritance diagram for icl::filter::LUTOp3Channel< T >:
icl::filter::UnaryOp icl::utils::Uncopyable icl::utils::Configurable

Classes

class  Plugin
 Internal plugin class for the LUTOp3Channel. More...
 

Public Member Functions

 LUTOp3Channel (Plugin *p=0, icl8u shift=0)
 creates a LUT object with given lut (LUT-mode) More...
 
virtual ~LUTOp3Channel ()
 Destructor. More...
 
virtual void apply (const core::ImgBase *src, core::ImgBase **dst)
 Common Filter apply function using current mode. More...
 
void setPlugin (Plugin *p)
 Sets a new plugin and re-calculates the internal LUT. More...
 
PluginremovePlugin ()
 removes the internal plugin so it is not deleted with the LUTOp More...
 
virtual void apply (const core::ImgBase *operand1, core::ImgBase **dst)=0
 Import unaryOps apply function without destination image. More...
 
virtual const core::ImgBaseapply (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...
 
UnaryOpoperator= (const UnaryOp &other)
 Explicit declaration of the assignment operator. More...
 
virtual ~UnaryOp ()
 Destructor. More...
 
virtual ICL_DEPRECATED void applyMT (const core::ImgBase *operand1, core::ImgBase **dst, unsigned int nThreads)
 apply function for multithreaded filtering (currently even slower than using one thread) More...
 
virtual const core::ImgBaseapply (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::ImgBaseoperator() (const core::ImgBase *src)
 function operator for the implicit destination apply(src) call More...
 
const core::ImgBaseoperator() (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...
 
Configurableoperator= (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...
 

Private Attributes

core::Img< T > m_oLUT
 Image that holds the lut data. More...
 
Pluginm_poPlugin
 Current plugin pointer. More...
 
icl8u m_ucShift
 channel range increment (...) 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 UnaryOpfromString (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 Configurableget (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 Configurablecreate_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::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)
 
virtual bool prepare (core::ImgBase **ppoDst, const core::ImgBase *poSrc)
 check+adapt destination image to properties of given source image More...
 
virtual bool prepare (core::ImgBase **ppoDst, const core::ImgBase *poSrc, core::depth eDepth)
 
- 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...
 
Propertyprop (const std::string &propertyName)
 this CAN be used e.g. to store a property value in internal property-list More...
 
const Propertyprop (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 Member Functions inherited from icl::utils::Uncopyable
 Uncopyable ()
 Empty base constructor. More...
 
- Protected Attributes inherited from icl::filter::UnaryOp
utils::MultiThreaderm_poMT
 
- Protected Attributes inherited from icl::utils::Configurable
std::vector< Callbackcallbacks
 internally managed list of callbacks More...
 

Detailed Description

template<class T>
class icl::filter::LUTOp3Channel< T >

class for applying table look-up transformation to 3-channel integer-valued images

In many applications it is necessary to create a feature map on 3-channel input images. These feature map creation procedure can take much time, depending on the complexity of the calculated feature. In a very simple case for instance, the LUTOp3Channel can be used to create thresholded color-distance map using the the euclidean distance to a reference color and a threshold for each pixel of the source image. This operation can be applied on each input (r,g,b)-Tuple by the following function (which is basically implemented in the "'Plugin" structure nested in the LUTOp3Channel class:

virtual T transform(icl8u v1, icl8u v2, icl8u v3){
return ::sqrt( ::pow(r-m_aiRGB[0],2) + ::pow(g-m_aiRGB[1],2) + ::pow(b-m_aiRGB[2],2) ) / (::sqrt(3.0)) < thresh ? 255 : 0;
}

This virtual function can be reimplemented by special plugins to calculate custom LUT-accelerated maps on icl8u/icl16s and icl32s -source images. The source images must be at least integer-typed, as the LUT, which is used internally has only discrete entries.
It is recommended to work with icl8u input images to avoid illegal memory access when using the LUT.

Implementing the Configurable Interface

The following procedure is used to create the LUT internally;

void create_lut(Plugin p, T lut[16777216]){
for(int r = 0; r < 256; ++r){
for(int g = 0; g < 256; ++g){
for(int b = 0; b < 256; ++b){
lut[r+ 256*g + 65536*b] = p.transform( r,g,b );
}
}
}
}

When the LUT is created internally, it can be used for fast feature map calculation using a simple table look-up:

\#define CAST(x) Cast<srcT,icl8u>::cast(x)
template<class srcT, class dstT>
void apply_lut_op_3(const Img<srcT> &src, Img<dstT> &dst, dstT *lut){
const srcT * pSrcR = src.getData(0);
const srcT * pSrcG = src.getData(1);
const srcT * pSrcB = src.getData(2);
dstT *pDst = dst.getData(0);
dstT *pDstEnd = pDst+dst.getDim();
while(pDst < pDstEnd){
*pDst++ = lut[ CAST(*pSrcR++) + 256*CAST(*pSrcG++) + 65536*CAST(*pSrcB++) ];
}
}

Performance

As it can be seen in section Implementing the Configurable Interface, each pixel is transformed by a simple table look up, which is performed by 2 multiplications, 2 additions and a simple dereferencing. The more complex part of this calculation is done by the calls to the Cast-class template. This is necessary to avoid index overruns due to the higher range of all non-icl8u input images types. The performance is much better, when using icl8u input images, because the Cast- call is left out in this case.

Benchmarks:

The default Plugins operation of threshold an implicitly created euclidean distance map takes about 18msec on an 640x480 3-channel icl8u input image. This can be accelerated by 61% to 11msec (1.6Mhz Pentium M) by using the LUTOp3Channel class. This benefit is not very high, but the euclidean distance function is only one possible function

\[ f:R^3~\rightarrow~R \]

which can be implemented using the 3 channel lut. Consider, that all of these possibly very complex operations will not take more then the above measured 11msec.

Optimization "Shift"

In some applications, it is sufficient to use a decreased resolution for each channel range. E.g. if we use only 7Bit per channel, we can reduce the LUT size from $2^{24} \mbox{bytes} = 16.8\mbox{MB}$ to $2^{21} \mbox{bytes} = 2.1\mbox{MB}$ further reduction of the quantization level of each channel to 6Bit results in a $2^{18} \mbox{bytes}=262\mbox{kB}$ LUT.
The benefit of this optimization is at first of course the saving of a large part of necessary memory, but in a second view, it also increases processing speed even beyond the speed enhancement achieved using a LUT. The reason for the speed advantage compared with the full size LUT can be explained by the cpu's cache management: When using a 16.8MB data array which is nearly randomly accessed, the data can not be cached permanently, so the cache flow in influenced negatively. The following table illustrates some benchmark results using different bit shifts, compared on a 640x480 rgb icl8u image.

Shift LUT size Time*
0 (no shift) 16.8MB 11ms
1 2.2MB 8ms
2 262kB 4.3ms
3 33kB 3.5ms
4 4kB 3.5ms
5 512 Bytes 3.5ms
6 64 Bytes 3.5ms
7 8 Bytes 3.5ms

A bit shift value of 2 seems to be the best compromise between data resolution vs. speed and not at least memory usage. But note: There are some applications, where the data resolution can not be scaled down using bit shifts.

Constructor & Destructor Documentation

◆ LUTOp3Channel()

template<class T >
icl::filter::LUTOp3Channel< T >::LUTOp3Channel ( Plugin p = 0,
icl8u  shift = 0 
)

creates a LUT object with given lut (LUT-mode)

Parameters
pplugin to use for the creation of the internal lut. Note:the LUTOp3Channel takes the ownership of the given plugin
shiftsee Optimization "Shift"

◆ ~LUTOp3Channel()

template<class T >
virtual icl::filter::LUTOp3Channel< T >::~LUTOp3Channel ( )
virtual

Destructor.

Member Function Documentation

◆ apply() [1/3]

template<class T >
virtual void icl::filter::LUTOp3Channel< T >::apply ( const core::ImgBase src,
core::ImgBase **  dst 
)
virtual

Common Filter apply function using current mode.

Parameters
srcsource image
dstdestination image**

Implements icl::filter::UnaryOp.

◆ apply() [2/3]

template<class T >
virtual const core::ImgBase* icl::filter::UnaryOp::apply

Import unaryOps apply function without destination image.

◆ apply() [3/3]

template<class T >
virtual void icl::filter::UnaryOp::apply

Import unaryOps apply function without destination image.

◆ removePlugin()

template<class T >
Plugin* icl::filter::LUTOp3Channel< T >::removePlugin ( )
inline

removes the internal plugin so it is not deleted with the LUTOp

◆ setPlugin()

template<class T >
void icl::filter::LUTOp3Channel< T >::setPlugin ( Plugin p)

Sets a new plugin and re-calculates the internal LUT.

Parameters
pplugin to use for the creation of the internal lut. Note:the LUTOp3Channel takes the ownership of the given plugin

Member Data Documentation

◆ m_oLUT

template<class T >
core::Img<T> icl::filter::LUTOp3Channel< T >::m_oLUT
private

Image that holds the lut data.

◆ m_poPlugin

template<class T >
Plugin* icl::filter::LUTOp3Channel< T >::m_poPlugin
private

Current plugin pointer.

◆ m_ucShift

template<class T >
icl8u icl::filter::LUTOp3Channel< T >::m_ucShift
private

channel range increment (...)


The documentation for this class was generated from the following file: