Ejemplo n.º 1
0
static int CvGLCM_gc(lua_State*L)
{
  luacv_obj<CvGLCM>*obj=(luacv_obj<CvGLCM>*)luaL_checkudata(L,1,CVGLCM_NAME);
  if (obj->dealloc_data)
    cvReleaseGLCM(&obj->data);

  return 0;
}
Ejemplo n.º 2
0
static void
icvCreateGLCM_LookupTable_8u_C1R( const uchar* srcImageData,
                                  int srcImageStep,
                                  CvSize srcImageSize,
                                  CvGLCM* destGLCM,
                                  int* steps,
                                  int numSteps,
                                  int* memorySteps )
{
    int* stepIncrementsCounter = 0;

    CV_FUNCNAME( "icvCreateGLCM_LookupTable_8u_C1R" );

    __BEGIN__;

    int matrixSideLength = destGLCM->matrixSideLength;
    int stepLoop, sideLoop1, sideLoop2;
    int colLoop, rowLoop, lineOffset = 0;
    double*** matrices = 0;

    // allocate memory to the matrices
    CV_CALL( destGLCM->matrices = (double***)cvAlloc( sizeof(matrices[0])*numSteps ));
    matrices = destGLCM->matrices;

    for( stepLoop=0; stepLoop<numSteps; stepLoop++ )
    {
        CV_CALL( matrices[stepLoop] = (double**)cvAlloc( sizeof(matrices[0][0])*matrixSideLength ));
        CV_CALL( matrices[stepLoop][0] = (double*)cvAlloc( sizeof(matrices[0][0][0])*
                                                  matrixSideLength*matrixSideLength ));

        memset( matrices[stepLoop][0], 0, matrixSideLength*matrixSideLength*
                                          sizeof(matrices[0][0][0]) );

        for( sideLoop1 = 1; sideLoop1 < matrixSideLength; sideLoop1++ )
        {
            matrices[stepLoop][sideLoop1] = matrices[stepLoop][sideLoop1-1] + matrixSideLength;
        }
    }

    CV_CALL( stepIncrementsCounter = (int*)cvAlloc( numSteps*sizeof(stepIncrementsCounter[0])));
    memset( stepIncrementsCounter, 0, numSteps*sizeof(stepIncrementsCounter[0]) );

    // generate GLCM for each step
    for( rowLoop=0; rowLoop<srcImageSize.height; rowLoop++, lineOffset+=srcImageStep )
    {
        for( colLoop=0; colLoop<srcImageSize.width; colLoop++ )
        {
            int pixelValue1 = destGLCM->forwardLookupTable[srcImageData[lineOffset + colLoop]];

            for( stepLoop=0; stepLoop<numSteps; stepLoop++ )
            {
                int col2, row2;
                row2 = rowLoop + steps[stepLoop*2 + 0];
                col2 = colLoop + steps[stepLoop*2 + 1];

                if( col2>=0 && row2>=0 && col2<srcImageSize.width && row2<srcImageSize.height )
                {
                    int memoryStep = memorySteps[ stepLoop ];
                    int pixelValue2 = destGLCM->forwardLookupTable[ srcImageData[ lineOffset + colLoop + memoryStep ] ];

                    // maintain symmetry
                    matrices[stepLoop][pixelValue1][pixelValue2] ++;
                    matrices[stepLoop][pixelValue2][pixelValue1] ++;

                    // incremenet counter of total number of increments
                    stepIncrementsCounter[stepLoop] += 2;
                }
            }
        }
    }

    // normalize matrices. each element is a probability of gray value i,j adjacency in direction/magnitude k
    for( sideLoop1=0; sideLoop1<matrixSideLength; sideLoop1++ )
    {
        for( sideLoop2=0; sideLoop2<matrixSideLength; sideLoop2++ )
        {
            for( stepLoop=0; stepLoop<numSteps; stepLoop++ )
            {
                matrices[stepLoop][sideLoop1][sideLoop2] /= double(stepIncrementsCounter[stepLoop]);
            }
        }
    }

    destGLCM->matrices = matrices;

    __END__;

    cvFree( &stepIncrementsCounter );

    if( cvGetErrStatus() < 0 )
        cvReleaseGLCM( &destGLCM, CV_GLCM_GLCM );
}
Ejemplo n.º 3
0
 void
cvCreateGLCMDescriptors( CvGLCM* destGLCM, int descriptorOptimizationType )
{
    CV_FUNCNAME( "cvCreateGLCMDescriptors" );

    __BEGIN__;

    int matrixLoop;

    if( !destGLCM )
        CV_ERROR( CV_StsNullPtr, "" );

    if( !(destGLCM->matrices) )
        CV_ERROR( CV_StsNullPtr, "Matrices are not allocated" );

    CV_CALL( cvReleaseGLCM( &destGLCM, CV_GLCM_DESC ));

    if( destGLCM->optimizationType != CV_GLCM_OPTIMIZATION_HISTOGRAM )
    {
        destGLCM->descriptorOptimizationType = destGLCM->numDescriptors = descriptorOptimizationType;
    }
    else
    {
        CV_ERROR( CV_StsBadFlag, "Histogram-based method is not implemented" );
//      destGLCM->descriptorOptimizationType = destGLCM->numDescriptors = CV_GLCMDESC_OPTIMIZATION_HISTOGRAM;
    }

    CV_CALL( destGLCM->descriptors = (double**)
            cvAlloc( destGLCM->numMatrices*sizeof(destGLCM->descriptors[0])));

    for( matrixLoop = 0; matrixLoop < destGLCM->numMatrices; matrixLoop ++ )
    {
        CV_CALL( destGLCM->descriptors[ matrixLoop ] =
                (double*)cvAlloc( destGLCM->numDescriptors*sizeof(destGLCM->descriptors[0][0])));
        memset( destGLCM->descriptors[matrixLoop], 0, destGLCM->numDescriptors*sizeof(destGLCM->descriptors[0][0]) );

        switch( destGLCM->descriptorOptimizationType )
        {
            case CV_GLCMDESC_OPTIMIZATION_ALLOWDOUBLENEST:
                icvCreateGLCMDescriptors_AllowDoubleNest( destGLCM, matrixLoop );
                break;
            default:
                CV_ERROR( CV_StsBadFlag,
                "descriptorOptimizationType different from CV_GLCMDESC_OPTIMIZATION_ALLOWDOUBLENEST\n"
                "is not supported" );
            /*
            case CV_GLCMDESC_OPTIMIZATION_ALLOWTRIPLENEST:
                icvCreateGLCMDescriptors_AllowTripleNest( destGLCM, matrixLoop );
                break;
            case CV_GLCMDESC_OPTIMIZATION_HISTOGRAM:
                if(matrixLoop < destGLCM->numMatrices>>1)
                    icvCreateGLCMDescriptors_Histogram( destGLCM, matrixLoop);
                    break;
            */
        }
    }

    __END__;

    if( cvGetErrStatus() < 0 )
        cvReleaseGLCM( &destGLCM, CV_GLCM_DESC );
}
Ejemplo n.º 4
0
int main(void)
{
  IplImage *src=NULL;
  if (0){
    src = cvCreateImageHeader(cvSize(4,4),IPL_DEPTH_8U,1);
    char rawdata[4][4] = { {0, 0, 1, 1},
			   {0, 0, 1, 1},
			   {0, 2, 2, 2},
			   {2, 2, 3, 3}};
    src->imageData = (char*)(&rawdata);
  }else{
    src = cvLoadImage("test.png",0);
  }
  CvGLCM* glcm;
//  glcm = cvCreateGLCM(src, 1, NULL, 4, CV_GLCM_OPTIMIZATION_LUT);
  glcm = cvCreateGLCM(src, 1, NULL, 4, CV_GLCM_OPTIMIZATION_NONE);
  cvCreateGLCMDescriptors(glcm, CV_GLCMDESC_OPTIMIZATION_ALLOWDOUBLENEST);
//#define CV_GLCMDESC_ENTROPY                         0
//#define CV_GLCMDESC_ENERGY                          1
//#define CV_GLCMDESC_HOMOGENITY                      2
//#define CV_GLCMDESC_CONTRAST                        3
//#define CV_GLCMDESC_CLUSTERTENDENCY                 4
//#define CV_GLCMDESC_CLUSTERSHADE                    5
//#define CV_GLCMDESC_CORRELATION                     6
//#define CV_GLCMDESC_CORRELATIONINFO1                7
//#define CV_GLCMDESC_CORRELATIONINFO2                8
//#define CV_GLCMDESC_MAXIMUMPROBABILITY              9

  for (int step=0; step<4; step++){ 
    for (int i=0; i<10; i++){
      printf("%.3f,", cvGetGLCMDescriptor(glcm, step, i));
    }
    printf("\n");
    
  }


  IplImage *d0org = cvCreateImage(cvSize(256,256),IPL_DEPTH_32F,1); 
  cvResize(cvCreateGLCMImage(glcm,0),d0org,CV_INTER_NN);
  IplImage *d0 = cvCreateImage(cvGetSize(d0org),IPL_DEPTH_8U,1);
  cvConvertScaleAbs(d0org,d0,255,0);
  cvNormalize(d0,d0,0,255,CV_MINMAX);
  cvSaveImage("d0.png",d0);

  IplImage *d1org = cvCreateImage(cvSize(256,256),IPL_DEPTH_32F,1); 
  cvResize(cvCreateGLCMImage(glcm,1),d1org,CV_INTER_NN);
  IplImage *d1 = cvCreateImage(cvGetSize(d1org),IPL_DEPTH_8U,1);
  cvConvertScaleAbs(d1org,d1,255,0);
  cvNormalize(d1,d1,0,255,CV_MINMAX);
  cvSaveImage("d1.png",d1);

  IplImage *d2org = cvCreateImage(cvSize(256,256),IPL_DEPTH_32F,1); 
  cvResize(cvCreateGLCMImage(glcm,2),d2org,CV_INTER_NN);
  IplImage *d2 = cvCreateImage(cvGetSize(d2org),IPL_DEPTH_8U,1);
  cvConvertScaleAbs(d2org,d2,255,0);
  cvNormalize(d2,d2,0,255,CV_MINMAX);
  cvSaveImage("d2.png",d2);

  IplImage *d3org = cvCreateImage(cvSize(256,256),IPL_DEPTH_32F,1); 
  cvResize(cvCreateGLCMImage(glcm,3),d3org,CV_INTER_NN);
  IplImage *d3 = cvCreateImage(cvGetSize(d3org),IPL_DEPTH_8U,1);
  cvConvertScaleAbs(d3org,d3,255,0);
  cvNormalize(d3,d3,0,255,CV_MINMAX);
  cvSaveImage("d3.png",d3);

  cvNamedWindow("D0",1);
  cvNamedWindow("D1",1);
  cvNamedWindow("D2",1);
  cvNamedWindow("D3",1);
  cvShowImage("D0",d0);
  cvShowImage("D1",d1);
  cvShowImage("D2",d2);
  cvShowImage("D3",d3);
  cvWaitKey(0);

  cvReleaseGLCM(glcm,CV_GLCM_ALL);
  return 0;
}