/home/neoflo/smb4k/SERVEUR/Millie/trunk/src/operator/NagaoOperator/NagaoLocalOperator.cpp

Aller à la documentation de ce fichier.
00001 /******************************************************************************
00002  *       __    _    _   _       _       _   _____                             *
00003  *       | \  / |  | | | |     | |     | |  | ___|                            *
00004  *       |  \/  |  | | | |     | |     | |  | |_                              *
00005  *       |      |  | | | |     | |     | |  |  _|                             *
00006  *       | |\/| |  | | | |__   | |__   | |  | |__                             *
00007  *       |_|  |_|  |_| |____|  |____|  |_|  |____|                            *
00008  * __________________________________________________________________________ *
00009  *                 Multifunctional Library For Image Processing               *
00010  *                                                                            *
00011  *                                                                            *
00012  *                                                                            *
00013  *      (c) Copyright 2007 by Humbert Florent                                 *
00014  *                                                                            *
00015  *      This program is free software; you can redistribute it and/or modify  *
00016  *      it under the terms of the GNU General Public License as published by  *
00017  *      the Free Software Foundation; only version 2 of the License.          *
00018  *                                                                            *
00019  *      This program is distributed in the hope that it will be useful,       *
00020  *      but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00021  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00022  *      GNU General Public License for more details.                          *
00023  *                                                                            *
00024  *      You should have received a copy of the GNU General Public License     *
00025  *      along with this program; if not, write to the Free Software           *
00026  *      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA             *
00027  *      02111-1307, USA.                                                      *
00028  ******************************************************************************/
00029 
00032 #include "MillieStd.hpp"
00033 
00034 #include "NagaoLocalOperator.hpp"
00035 
00036 using namespace Millie;
00037 
00038 
00039 inline static void computeVarianceAndAverage(std::vector<float>& vect, float & variance, float & moyenne)
00040 {
00041   moyenne = getAverage(vect);
00042 
00043   variance = 0;
00044 
00045   for(unsigned int i = 0; i<vect.size(); i++)
00046     variance += Math::square(vect[i] - moyenne);
00047 }
00048 
00049 
00050 
00051 inline static int getMinimumRange(std::vector<float>& vect)
00052 {
00053   if(vect.size() == 0)
00054     throw IllegalArgument("getMinimum");
00055 
00056 
00057   float mini = 0.0f;
00058   int range = 0;
00059 
00060   for(unsigned int i = 1; i<vect.size(); i++)
00061     if(vect[i]<mini)
00062     {
00063       mini = vect[i];
00064       range = i;
00065     }
00066 
00067   return range;
00068 }
00069 
00070 NagaoLocalOperator::NagaoLocalOperator(const NagaoLocalOperator& origine)
00071     : LocalAreaOperator(origine)
00072 {
00073   _vectKernel.resize(origine._vectKernel.size());
00074 
00075   for(unsigned int i=0; i<_vectKernel.size(); i++)
00076    _vectKernel[i] = new Kernel(*origine._vectKernel[i]);
00077 }
00078 
00079 NagaoLocalOperator* NagaoLocalOperator::clone() const
00080 {
00081   return new NagaoLocalOperator(*this);
00082 }
00083 
00084 
00085 NagaoLocalOperator::NagaoLocalOperator() :
00086     LocalAreaOperator(2,2,2,2)
00087 {
00088 
00089   float a [] =
00090     {
00091       1,1,0,
00092       1,1,1,
00093       0,1,1
00094     };
00095 
00096   Kernel* ka = new Kernel(3,3,2,2,a);
00097 
00098   float e [] =
00099     {
00100       1,1,1,
00101       1,1,1,
00102       0,1,0
00103     };
00104 
00105   Kernel* ke = new Kernel(3,3,1,2,e);
00106 
00107   float b [] =
00108     {
00109       0,1,1,
00110       1,1,1,
00111       1,1,0
00112     };
00113 
00114   Kernel* kb = new Kernel(3,3,0,2,b);
00115 
00116   float h [] =
00117     {
00118 
00119       1,1,0,
00120       1,1,1,
00121       1,1,0
00122     };
00123 
00124 
00125   Kernel* kh = new Kernel(3,3,2,1,h);
00126 
00127   float f [] =
00128     {
00129 
00130       0,1,1,
00131       1,1,1,
00132       0,1,1
00133 
00134     };
00135   Kernel* kf = new Kernel(3,3,0,1,f);
00136 
00137   float d[] =
00138     {
00139 
00140 
00141       0,1,1,
00142       1,1,1,
00143       1,1,0
00144     };
00145   Kernel* kd = new Kernel(3,3,2,0,d);
00146 
00147   float g[] =
00148     {
00149 
00150       0,1,0,
00151       1,1,1,
00152       1,1,1
00153     };
00154   Kernel* kg = new Kernel(3,3,1,0,g);
00155 
00156   float c[] =
00157     {
00158 
00159       1,1,0,
00160       1,1,1,
00161       0,1,1
00162     };
00163 
00164   Kernel* kc = new Kernel(3,3,0,0,c);
00165 
00166 
00167   _vectKernel.push_back(ka);
00168   _vectKernel.push_back(kb);
00169   _vectKernel.push_back(kc);
00170   _vectKernel.push_back(kd);
00171   _vectKernel.push_back(ke);
00172   _vectKernel.push_back(kf);
00173   _vectKernel.push_back(kg);
00174   _vectKernel.push_back(kh);
00175 }
00176 
00177 NagaoLocalOperator::~NagaoLocalOperator()
00178 {
00179   for(unsigned int i = 0; i< _vectKernel.size(); i++)
00180   {
00181     delete _vectKernel[i];
00182     _vectKernel[i] = 0;
00183   }
00184   _vectKernel.clear();
00185 }
00186 
00187 float NagaoLocalOperator::computeLocalArea(const Image& image, int i, int j, int canal)
00188 {
00189 
00190 
00191   /*stocke toutes les valeurs de l'image là ou le noyau vaut 1 à un position donnée*/
00192   std::vector<float> allKernelValue;
00193 
00194   /*stocke toutes les variances pour tous les noyaux à une position donnée*/
00195   std::vector<float> allVariance;
00196 
00197   /*stocke toutes les moyennes pour tous les noyaux à une position donnée*/
00198   std::vector<float> allAverage;
00199 
00200   allVariance.resize(0);
00201   allAverage.resize(0);
00202 
00203   for(unsigned int vectKerneli = 0; vectKerneli < _vectKernel.size(); vectKerneli++)
00204   {
00205     allKernelValue.resize(0);
00206     const Kernel& currentKernel = *_vectKernel[vectKerneli];
00207 
00208     for(int kj =0; kj< currentKernel.getHeight(); kj++)
00209       for(int ki = 0; ki< currentKernel.getWidth(); ki++)
00210       {
00211         /*si le masque vaut 1 à cette position, on enregistre le pixel*/
00212         if(currentKernel(ki, kj) == 1)
00213           allKernelValue.push_back(
00214             image.getPixel(i-currentKernel.getXOrigin() + ki,
00215                            j-currentKernel.getYOrigin() + kj,
00216                            canal));
00217       }
00218 
00219     /*on enregistre la variance et la moyenne pour tous ces pixels*/
00220     float variance;
00221     float moyenne;
00222     computeVarianceAndAverage(allKernelValue, variance, moyenne);
00223     allVariance.push_back(variance);
00224     allAverage.push_back(moyenne);
00225   }
00226 
00227   /*on détermine le noyau pour lequel la variance est minimal*/
00228   int range = getMinimumRange(allVariance);
00229 
00230   /*on écrit le pixel correspondant à la moyenne du noyau ayant
00231    * la plus petite variance
00232    */
00233   return allAverage[range];
00234 }

Généré le Fri May 18 23:24:43 2007 pour Millie par  doxygen 1.5.1