00001 #ifndef Impala_Core_Array_ColorGaborResponses_h
00002 #define Impala_Core_Array_ColorGaborResponses_h
00003
00004 #include <vector>
00005 #include "Util/Math.h"
00006 #include "Core/Array/ColorSegmentationInvariant.h"
00007 #include "Core/Array/ColorSegmentationAlgorithm.h"
00008 #include "Core/Array/ColorSpace.h"
00009 #include "Core/Array/ProjectRange.h"
00010 #include "Core/Array/Set.h"
00011 #include "Core/Array/Div.h"
00012 #include "Core/Array/RecGauss.h"
00013 #include "Core/Array/RecGabor.h"
00014 #include "Core/Array/Norm2.h"
00015
00016 namespace Impala
00017 {
00018 namespace Core
00019 {
00020 namespace Array
00021 {
00022
00023
00024 inline std::vector<Array2dScalarReal64*>
00025 ColorGaborResponses(Array2dVec3Real64* im,
00026 ColorSegmentationAlgorithm segAlg,
00027 ColorSegmentationInvariant invariantType,
00028 int nrScales, double* scales, double* freqs,
00029 int nrOrient)
00030 {
00031
00032 double* orients = new double[nrOrient];
00033 orients[0] = 0;
00034 for (int i=1 ; i<nrOrient; i++)
00035 orients[i] = orients[i-1] + M_PI/nrOrient;
00036
00037
00038 ColorSpace(im, im, Element::RGB, Element::OOO);
00039
00040 int width = im->CW();
00041 int height = im->CH();
00042
00043
00044 std::vector<Array2dScalarReal64*> imList;
00045
00046 Array2dScalarReal64* imOOO_SR64[3];
00047 Array2dComplex64* imOOO_C64[3];
00048 for (int ii=0 ; ii<3 ; ii++)
00049 {
00050 imOOO_SR64[ii] = 0;
00051 ProjectRange(imOOO_SR64[ii], im, ii+1);
00052 imOOO_C64[ii] = 0;
00053 Set(imOOO_C64[ii], imOOO_SR64[ii]);
00054 }
00055 Array2dScalarReal64* E_0_SR64 = 0;
00056 Array2dComplex64* E_0_C64 = 0;
00057 Array2dComplex64* gabor = 0;
00058 Array2dScalarReal64* tmp_SR64 = 0;
00059 Array2dComplex64* tmp_C64 = 0;
00060
00061
00062
00063
00064 if (segAlg!=OnlyZero)
00065 {
00066 for (int fi=0; fi<nrScales; fi++)
00067 {
00068 for (int oi=0; oi<nrOrient; oi++)
00069 {
00070
00071 if (invariantType != E)
00072 RecGauss(E_0_SR64, imOOO_SR64[0], scales[fi], scales[fi],
00073 0, 0, 3);
00074
00075
00076 for (int pixDim=(invariantType==E || invariantType==W)?1:2 ;
00077 pixDim<=3 ; pixDim++)
00078 {
00079
00080
00081 if (invariantType!=Ci)
00082 RecGabor(gabor, imOOO_C64[pixDim-1], scales[fi],
00083 freqs[fi], orients[oi]);
00084 else
00085 {
00086
00087 Div(tmp_SR64, imOOO_SR64[pixDim-1], E_0_SR64);
00088 Set(tmp_C64, tmp_SR64);
00089 RecGabor(gabor, tmp_C64, scales[fi], freqs[fi],
00090 orients[oi]);
00091 }
00092
00093 Array2dScalarReal64* res = 0;
00094 Norm2(res, gabor);
00095
00096
00097
00098 if (invariantType == W || invariantType ==C)
00099 Div(res, res, E_0_SR64);
00100
00101
00102 RecGauss(res, res, 1.95*scales[fi], 1.95*scales[fi],
00103 0, 0, 3);
00104 imList.push_back(res);
00105
00106 }
00107 }
00108 }
00109 }
00110
00111
00112 if (segAlg != Texture)
00113 {
00114 double scale0 = 8.0 ;
00115
00116
00117 if (invariantType != E)
00118 RecGauss(E_0_SR64, imOOO_SR64[0], scale0, scale0, 0, 0, 3);
00119
00120
00121
00122
00123
00124 for (int pixDim=invariantType==E?1:2 ; pixDim<=3 ; pixDim++)
00125 {
00126 Array2dScalarReal64* res = 0;
00127
00128
00129 if (invariantType!=Ci)
00130 RecGauss(res, imOOO_SR64[pixDim-1], scale0, scale0, 0, 0, 3);
00131 else
00132 {
00133 Div(tmp_SR64, imOOO_SR64[pixDim-1], E_0_SR64);
00134 RecGauss(res, tmp_SR64, scale0, scale0, 0, 0, 3);
00135 }
00136
00137
00138 if (invariantType == W || invariantType ==C)
00139 Div(res, res, E_0_SR64);
00140
00141 imList.push_back(res);
00142
00143 }
00144 }
00145
00146 delete orients;
00147 for (int j=0 ; j<3 ; j++)
00148 {
00149 delete imOOO_SR64[j];
00150 delete imOOO_C64[j];
00151 }
00152 delete E_0_SR64;
00153 delete E_0_C64;
00154 delete gabor;
00155 delete tmp_SR64;
00156 delete tmp_C64;
00157
00158 return imList;
00159 }
00160
00161 inline std::vector<Array2dScalarReal64*>
00162 ColorGaborResponses(Array2dVec3Real64* im,
00163 ColorSegmentationAlgorithm segAlg,
00164 ColorSegmentationInvariant invariantType)
00165 {
00166 const int nrScales = 4;
00167 const int nrFreqs = 4;
00168 const int nrOrient = 4;
00169
00170
00171 double scales[nrScales];
00172 double freqs[nrFreqs];
00173
00174 scales[0] = 4.0 ; freqs[0] = 0.318 ;
00175 scales[1] = 2.828 ; freqs[1] = 0.720 ;
00176 scales[2] = 2.0 ; freqs[2] = 1.289 ;
00177 scales[3] = 1.414 ; freqs[3] = 2.094 ;
00178
00179 return ColorGaborResponses(im, segAlg, invariantType, nrScales,
00180 scales, freqs, nrOrient);
00181 }
00182
00183 }
00184 }
00185 }
00186
00187 #endif