http://blog.youkuaiyun.com/cxf7394373/article/details/6988229
應用
由上面的敘述知道,可以根據各種間距和角度計算灰度共生矩陣,下面程序中給定了間距,根據傳入的參數計算:
- #define GLCM_DIS 3 //灰度共生矩陣的統計距離
- #define GLCM_CLASS 16 //計算灰度共生矩陣的圖像灰度值等級化
- #define GLCM_ANGLE_HORIZATION 0 //水平
- #define GLCM_ANGLE_VERTICAL 1 //垂直
- #define GLCM_ANGLE_DIGONAL 2 //對角
- int calGLCM(IplImage* bWavelet,int angleDirection,double* featureVector)
- {
- int i,j;
- int width,height;
- if(NULL == bWavelet)
- return 1;
- width = bWavelet->width;
- height = bWavelet->height;
- int * glcm = new int[GLCM_CLASS * GLCM_CLASS];
- int * histImage = new int[width * height];
- if(NULL == glcm || NULL == histImage)
- return 2;
- //灰度等級化---分GLCM_CLASS個等級
- uchar *data =(uchar*) bWavelet->imageData;
- for(i = 0;i < height;i++){
- for(j = 0;j < width;j++){
- histImage[i * width + j] = (int)(data[bWavelet->widthStep * i + j] * GLCM_CLASS / 256);
- }
- }
- //初始化共生矩陣
- for (i = 0;i < GLCM_CLASS;i++)
- for (j = 0;j < GLCM_CLASS;j++)
- glcm[i * GLCM_CLASS + j] = 0;
- //計算灰度共生矩陣
- int w,k,l;
- //水平方向
- if(angleDirection == GLCM_ANGLE_HORIZATION)
- {
- for (i = 0;i < height;i++)
- {
- for (j = 0;j < width;j++)
- {
- l = histImage[i * width + j];
- if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width)
- {
- k = histImage[i * width + j + GLCM_DIS];
- glcm[l * GLCM_CLASS + k]++;
- }
- if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width)
- {
- k = histImage[i * width + j - GLCM_DIS];
- glcm[l * GLCM_CLASS + k]++;
- }
- }
- }
- }
- //垂直方向
- else if(angleDirection == GLCM_ANGLE_VERTICAL)
- {
- for (i = 0;i < height;i++)
- {
- for (j = 0;j < width;j++)
- {
- l = histImage[i * width + j];
- if(i + GLCM_DIS >= 0 && i + GLCM_DIS < height)
- {
- k = histImage[(i + GLCM_DIS) * width + j];
- glcm[l * GLCM_CLASS + k]++;
- }
- if(i - GLCM_DIS >= 0 && i - GLCM_DIS < height)
- {
- k = histImage[(i - GLCM_DIS) * width + j];
- glcm[l * GLCM_CLASS + k]++;
- }
- }
- }
- }
- //對角方向
- else if(angleDirection == GLCM_ANGLE_DIGONAL)
- {
- for (i = 0;i < height;i++)
- {
- for (j = 0;j < width;j++)
- {
- l = histImage[i * width + j];
- if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width && i + GLCM_DIS >= 0 && i + GLCM_DIS < height)
- {
- k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS];
- glcm[l * GLCM_CLASS + k]++;
- }
- if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width && i - GLCM_DIS >= 0 && i - GLCM_DIS < height)
- {
- k = histImage[(i - GLCM_DIS) * width + j - GLCM_DIS];
- glcm[l * GLCM_CLASS + k]++;
- }
- }
- }
- }
- //計算特征值
- double entropy = 0,energy = 0,contrast = 0,homogenity = 0;
- for (i = 0;i < GLCM_CLASS;i++)
- {
- for (j = 0;j < GLCM_CLASS;j++)
- {
- //熵
- if(glcm[i * GLCM_CLASS + j] > 0)
- entropy -= glcm[i * GLCM_CLASS + j] * log10(double(glcm[i * GLCM_CLASS + j]));
- //能量
- energy += glcm[i * GLCM_CLASS + j] * glcm[i * GLCM_CLASS + j];
- //對比度
- contrast += (i - j) * (i - j) * glcm[i * GLCM_CLASS + j];
- //一致性
- homogenity += 1.0 / (1 + (i - j) * (i - j)) * glcm[i * GLCM_CLASS + j];
- }
- }
- //返回特征值
- i = 0;
- featureVector[i++] = entropy;
- featureVector[i++] = energy;
- featureVector[i++] = contrast;
- featureVector[i++] = homogenity;
- delete[] glcm;
- delete[] histImage;
- return 0;
- }