Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

std::vector<Array2dScalarReal64*> Impala::Core::Array::ColorGaborResponses ( Array2dVec3Real64 *  im,
ColorSegmentationAlgorithm  segAlg,
ColorSegmentationInvariant  invariantType,
int  nrScales,
double *  scales,
double *  freqs,
int  nrOrient 
) [inline]

Definition at line 25 of file ColorGaborResponses.h.

References C, Ci, ColorSpace(), Div(), E, M_PI, Norm2(), OnlyZero, Impala::Core::Array::Element::OOO, ProjectRange(), RecGabor(), RecGauss(), Impala::Core::Array::Element::RGB, Set(), Texture, and W.

Referenced by ColorGaborResponses(), and ColorSegmentation().

00030 {
00031     // set the different orientations
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     // convert to opponent color space
00038     ColorSpace(im, im, Element::RGB, Element::OOO);
00039 
00040     int width = im->CW();
00041     int height = im->CH();
00042 
00043     // declare and initialize temporary images
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     // get a list of all gabor responses
00062 
00063     // if texture is required
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                 // only the E and W invariant use the intensity channel
00076                 for (int pixDim=(invariantType==E || invariantType==W)?1:2 ;
00077                      pixDim<=3 ; pixDim++)
00078                 {
00079 
00080                     // with Ci invariant first divide by intensity E_0
00081                     if (invariantType!=Ci) 
00082                         RecGabor(gabor, imOOO_C64[pixDim-1], scales[fi],
00083                                  freqs[fi], orients[oi]);
00084                     else
00085                     {
00086                         // to do : combine Div and Set
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                     // with C and W invariant divide by intensity E_0 after
00097                     // Gabor filtering
00098                     if (invariantType == W || invariantType ==C) 
00099                          Div(res, res, E_0_SR64); 
00100 
00101                     //smooth and add to image list
00102                     RecGauss(res, res, 1.95*scales[fi], 1.95*scales[fi],
00103                              0, 0, 3);
00104                     imList.push_back(res);
00105 //CX_COUT << "imList.size = " << imList.size() << CX_ENDL;
00106                 }
00107             }
00108         }
00109     }
00110 
00111     // if the zero freq. (no texture) is required
00112     if (segAlg != Texture)
00113     {
00114         double scale0 = 8.0 ;
00115 
00116         // add a zero-frequency response, for uniform color regions
00117         if (invariantType != E)
00118             RecGauss(E_0_SR64, imOOO_SR64[0], scale0, scale0, 0, 0, 3);
00119 
00120         // only the E and W invariant use the intensity channel
00121         // yet, as this is only color, the W invariant becomes 1, so we can
00122         // leave W out, here.
00123 
00124         for (int pixDim=invariantType==E?1:2 ; pixDim<=3 ; pixDim++)
00125         {
00126             Array2dScalarReal64* res = 0;
00127 
00128             // with Ci invariant first divide by intensity E_0
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             // with C and W invariant divide by intensity E_0 after Gabor filtering
00138             if (invariantType == W || invariantType ==C)
00139                 Div(res, res, E_0_SR64);
00140 
00141             imList.push_back(res);
00142 //CX_COUT << "imList.size = " << imList.size() << CX_ENDL;
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 }

Here is the call graph for this function:


Generated on Fri Mar 19 10:56:10 2010 for ImpalaSrc by  doxygen 1.5.1