00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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
00192 std::vector<float> allKernelValue;
00193
00194
00195 std::vector<float> allVariance;
00196
00197
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
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
00220 float variance;
00221 float moyenne;
00222 computeVarianceAndAverage(allKernelValue, variance, moyenne);
00223 allVariance.push_back(variance);
00224 allAverage.push_back(moyenne);
00225 }
00226
00227
00228 int range = getMinimumRange(allVariance);
00229
00230
00231
00232
00233 return allAverage[range];
00234 }