mirror of
https://github.com/opencv/opencv.git
synced 2024-12-16 02:19:12 +08:00
241 lines
12 KiB
C++
241 lines
12 KiB
C++
/*#******************************************************************************
|
|
** IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
|
**
|
|
** By downloading, copying, installing or using the software you agree to this license.
|
|
** If you do not agree to this license, do not download, install,
|
|
** copy or use the software.
|
|
**
|
|
**
|
|
** HVStools : interfaces allowing OpenCV users to integrate Human Vision System models. Presented models originate from Jeanny Herault's original research and have been reused and adapted by the author&collaborators for computed vision applications since his thesis with Alice Caplier at Gipsa-Lab.
|
|
** Use: extract still images & image sequences features, from contours details to motion spatio-temporal features, etc. for high level visual scene analysis. Also contribute to image enhancement/compression such as tone mapping.
|
|
**
|
|
** Maintainers : Listic lab (code author current affiliation & applications) and Gipsa Lab (original research origins & applications)
|
|
**
|
|
** Creation - enhancement process 2007-2011
|
|
** Author: Alexandre Benoit (benoit.alexandre.vision@gmail.com), LISTIC lab, Annecy le vieux, France
|
|
**
|
|
** Theses algorithm have been developped by Alexandre BENOIT since his thesis with Alice Caplier at Gipsa-Lab (www.gipsa-lab.inpg.fr) and the research he pursues at LISTIC Lab (www.listic.univ-savoie.fr).
|
|
** Refer to the following research paper for more information:
|
|
** Benoit A., Caplier A., Durette B., Herault, J., "USING HUMAN VISUAL SYSTEM MODELING FOR BIO-INSPIRED LOW LEVEL IMAGE PROCESSING", Elsevier, Computer Vision and Image Understanding 114 (2010), pp. 758-773, DOI: http://dx.doi.org/10.1016/j.cviu.2010.01.011
|
|
** This work have been carried out thanks to Jeanny Herault who's research and great discussions are the basis of all this work, please take a look at his book:
|
|
** Vision: Images, Signals and Neural Networks: Models of Neural Processing in Visual Perception (Progress in Neural Processing),By: Jeanny Herault, ISBN: 9814273686. WAPI (Tower ID): 113266891.
|
|
**
|
|
** The retina filter includes the research contributions of phd/research collegues from which code has been redrawn by the author :
|
|
** _take a look at the retinacolor.hpp module to discover Brice Chaix de Lavarene color mosaicing/demosaicing and the reference paper:
|
|
** ====> B. Chaix de Lavarene, D. Alleysson, B. Durette, J. Herault (2007). "Efficient demosaicing through recursive filtering", IEEE International Conference on Image Processing ICIP 2007
|
|
** _take a look at imagelogpolprojection.hpp to discover retina spatial log sampling which originates from Barthelemy Durette phd with Jeanny Herault. A Retina / V1 cortex projection is also proposed and originates from Jeanny's discussions.
|
|
** ====> more informations in the above cited Jeanny Heraults's book.
|
|
**
|
|
** License Agreement
|
|
** For Open Source Computer Vision Library
|
|
**
|
|
** Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
|
** Copyright (C) 2008-2011, Willow Garage Inc., all rights reserved.
|
|
**
|
|
** For Human Visual System tools (hvstools)
|
|
** Copyright (C) 2007-2011, LISTIC Lab, Annecy le Vieux and GIPSA Lab, Grenoble, France, all rights reserved.
|
|
**
|
|
** Third party copyrights are property of their respective owners.
|
|
**
|
|
** Redistribution and use in source and binary forms, with or without modification,
|
|
** are permitted provided that the following conditions are met:
|
|
**
|
|
** * Redistributions of source code must retain the above copyright notice,
|
|
** this list of conditions and the following disclaimer.
|
|
**
|
|
** * Redistributions in binary form must reproduce the above copyright notice,
|
|
** this list of conditions and the following disclaimer in the documentation
|
|
** and/or other materials provided with the distribution.
|
|
**
|
|
** * The name of the copyright holders may not be used to endorse or promote products
|
|
** derived from this software without specific prior written permission.
|
|
**
|
|
** This software is provided by the copyright holders and contributors "as is" and
|
|
** any express or implied warranties, including, but not limited to, the implied
|
|
** warranties of merchantability and fitness for a particular purpose are disclaimed.
|
|
** In no event shall the Intel Corporation or contributors be liable for any direct,
|
|
** indirect, incidental, special, exemplary, or consequential damages
|
|
** (including, but not limited to, procurement of substitute goods or services;
|
|
** loss of use, data, or profits; or business interruption) however caused
|
|
** and on any theory of liability, whether in contract, strict liability,
|
|
** or tort (including negligence or otherwise) arising in any way out of
|
|
** the use of this software, even if advised of the possibility of such damage.
|
|
*******************************************************************************/
|
|
|
|
#ifndef IMAGELOGPOLPROJECTION_H_
|
|
#define IMAGELOGPOLPROJECTION_H_
|
|
|
|
/**
|
|
* @class ImageLogPolProjection
|
|
* @brief class able to perform a log sampling of an image input (models the log sampling of the photoreceptors of the retina)
|
|
* or a log polar projection which models the retina information projection on the primary visual cortex: a linear projection in the center for detail analysis and a log projection of the borders (low spatial frequency motion information in general)
|
|
*
|
|
* collaboration: Barthelemy DURETTE who experimented the retina log projection
|
|
-> "Traitement visuels Bio mimtiques pour la supplance perceptive", internal technical report, May 2005, Gipsa-lab/DIS, Grenoble, FRANCE
|
|
*
|
|
* * TYPICAL USE:
|
|
*
|
|
* // create object, here for a log sampling (keyword:RETINALOGPROJECTION): (dynamic object allocation sample)
|
|
* ImageLogPolProjection *imageSamplingTool;
|
|
* imageSamplingTool = new ImageLogPolProjection(frameSizeRows, frameSizeColumns, RETINALOGPROJECTION);
|
|
*
|
|
* // init log projection:
|
|
* imageSamplingTool->initProjection(1.0, 15.0);
|
|
*
|
|
* // during program execution, call the log transform applied to a frame called "FrameBuffer" :
|
|
* imageSamplingTool->runProjection(FrameBuffer);
|
|
* // get output frame and its size:
|
|
* const unsigned int logSampledFrame_nbRows=imageSamplingTool->getOutputNBrows();
|
|
* const unsigned int logSampledFrame_nbColumns=imageSamplingTool->getOutputNBcolumns();
|
|
* const double *logSampledFrame=imageSamplingTool->getSampledFrame();
|
|
*
|
|
* // at the end of the program, destroy object:
|
|
* delete imageSamplingTool;
|
|
*
|
|
* @author Alexandre BENOIT, benoit.alexandre.vision@gmail.com, LISTIC : www.listic.univ-savoie.fr, Gipsa-Lab, France: www.gipsa-lab.inpg.fr/
|
|
* Creation date 2007
|
|
*/
|
|
|
|
//#define __IMAGELOGPOLPROJECTION_DEBUG // used for std output debug information
|
|
|
|
#include "basicretinafilter.hpp"
|
|
|
|
|
|
namespace cv
|
|
{
|
|
|
|
class ImageLogPolProjection:public BasicRetinaFilter
|
|
{
|
|
public:
|
|
|
|
enum PROJECTIONTYPE{RETINALOGPROJECTION, CORTEXLOGPOLARPROJECTION};
|
|
|
|
/**
|
|
* constructor, just specifies the image input size and the projection type, no projection initialisation is done
|
|
* -> use initLogRetinaSampling() or initLogPolarCortexSampling() for that
|
|
* @param nbRows: number of rows of the input image
|
|
* @param nbColumns: number of columns of the input image
|
|
* @param projection: the type of projection, RETINALOGPROJECTION or CORTEXLOGPOLARPROJECTION
|
|
* @param colorMode: specifies if the projection is applied on a grayscale image (false) or color images (3 layers) (true)
|
|
*/
|
|
ImageLogPolProjection(const unsigned int nbRows, const unsigned int nbColumns, const PROJECTIONTYPE projection, const bool colorMode=false);
|
|
|
|
/**
|
|
* standard destructor
|
|
*/
|
|
virtual ~ImageLogPolProjection();
|
|
|
|
/**
|
|
* function that clears all buffers of the object
|
|
*/
|
|
void clearAllBuffers();
|
|
|
|
/**
|
|
* resize retina color filter object (resize all allocated buffers)
|
|
* @param NBrows: the new height size
|
|
* @param NBcolumns: the new width size
|
|
*/
|
|
void resize(const unsigned int NBrows, const unsigned int NBcolumns);
|
|
|
|
/**
|
|
* init function depending on the projection type
|
|
* @param reductionFactor: the size reduction factor of the ouptup image in regard of the size of the input image, must be superior to 1
|
|
* @param samplingStrenght: specifies the strenght of the log compression effect (magnifying coefficient)
|
|
* @return true if the init was performed without any errors
|
|
*/
|
|
bool initProjection(const double reductionFactor, const double samplingStrenght);
|
|
|
|
/**
|
|
* main funtion of the class: run projection function
|
|
* @param inputFrame: the input frame to be processed
|
|
* @param colorMode: the input buffer color mode: false=gray levels, true = 3 color channels mode
|
|
* @return the output frame
|
|
*/
|
|
std::valarray<float> &runProjection(const std::valarray<float> &inputFrame, const bool colorMode=false);
|
|
|
|
/**
|
|
* @return the numbers of rows (height) of the images OUTPUTS of the object
|
|
*/
|
|
inline unsigned int getOutputNBrows(){return _outputNBrows;};
|
|
|
|
/**
|
|
* @return the numbers of columns (width) of the images OUTPUTS of the object
|
|
*/
|
|
inline unsigned int getOutputNBcolumns(){return _outputNBcolumns;};
|
|
|
|
/**
|
|
* main funtion of the class: run projection function
|
|
* @param size: one of the input frame initial dimensions to be processed
|
|
* @return the output frame dimension
|
|
*/
|
|
inline static unsigned int predictOutputSize(const unsigned int size, const double reductionFactor){return (unsigned int)((double)size/reductionFactor);};
|
|
|
|
/**
|
|
* @return the output of the filter which applies an irregular Low Pass spatial filter to the imag input (see function
|
|
*/
|
|
inline const std::valarray<float> &getIrregularLPfilteredInputFrame() const {return _irregularLPfilteredFrame;};
|
|
|
|
/**
|
|
* function which allows to retrieve the output frame which was updated after the "runProjection(...) function BasicRetinaFilter::runProgressiveFilter(...)
|
|
* @return the projection result
|
|
*/
|
|
inline const std::valarray<float> &getSampledFrame() const {return _sampledFrame;};
|
|
|
|
/**
|
|
* function which allows gives the tranformation table, its size is (getNBrows()*getNBcolumns()*2)
|
|
* @return the transformation matrix [outputPixIndex_i, inputPixIndex_i, outputPixIndex_i+1, inputPixIndex_i+1....]
|
|
*/
|
|
inline const std::valarray<unsigned int> &getSamplingMap() const {return _transformTable;};
|
|
|
|
inline double getOriginalRadiusLength(const double projectedRadiusLength){return _azero/(_alim-projectedRadiusLength*2.0/_minDimension);};
|
|
|
|
// unsigned int getInputPixelIndex(const unsigned int ){ return _transformTable[index*2+1]};
|
|
|
|
private:
|
|
PROJECTIONTYPE _selectedProjection;
|
|
|
|
// size of the image output
|
|
unsigned int _outputNBrows;
|
|
unsigned int _outputNBcolumns;
|
|
unsigned int _outputNBpixels;
|
|
unsigned int _outputDoubleNBpixels;
|
|
unsigned int _inputDoubleNBpixels;
|
|
|
|
// is the object able to manage color flag
|
|
bool _colorModeCapable;
|
|
// sampling strenght factor
|
|
double _samplingStrenght;
|
|
// sampling reduction factor
|
|
double _reductionFactor;
|
|
|
|
// log sampling parameters
|
|
double _azero;
|
|
double _alim;
|
|
double _minDimension;
|
|
|
|
// template buffers
|
|
std::valarray<float>_sampledFrame;
|
|
std::valarray<float>&_tempBuffer;
|
|
std::valarray<unsigned int>_transformTable;
|
|
|
|
std::valarray<float> &_irregularLPfilteredFrame; // just a reference for easier understanding
|
|
unsigned int _usefullpixelIndex;
|
|
|
|
// init transformation tables
|
|
bool _computeLogProjection();
|
|
bool _computeLogPolarProjection();
|
|
|
|
// specifies if init was done correctly
|
|
bool _initOK;
|
|
// private init projections functions called by "initProjection(...)" function
|
|
bool _initLogRetinaSampling(const double reductionFactor, const double samplingStrenght);
|
|
bool _initLogPolarCortexSampling(const double reductionFactor, const double samplingStrenght);
|
|
|
|
ImageLogPolProjection(const ImageLogPolProjection&);
|
|
ImageLogPolProjection& operator=(const ImageLogPolProjection&);
|
|
|
|
};
|
|
|
|
}
|
|
#endif /*IMAGELOGPOLPROJECTION_H_*/
|