• 图像的灰度共生矩阵(转载)


    Gray-level co-occurrence matrix from an image

    图像的灰度共生矩阵

    灰度共生矩阵是像素距离和角度的矩阵函数,它通过计算图像中一定距离和一定方向的两点灰度之间的相关性,来反映图像灰度在方向、间隔、变化幅度及快慢上的综合信息。它是分析图像的局部模式和它们排列规则的基础

    使用方法:
    glcm = graycomatrix(I)
    glcms = graycomatrix(I,param1,val1,param2,val2,...)
    [glcms,SI] = graycomatrix(...)

    描述:
    glcms = graycomatrix(I) 产生图像I的灰度共生矩阵GLCM。它是通过计算两灰度值在图像I中水平相邻的次数而得到的 (也不必是水平相邻的次数,这一参数是可调的,可能通过Offsets来进行调整,比如[0 D]代表是水平方向,[-D D]代表是右上角45度方向,[-D 0]代表是竖直方向,即90度方向,而[-D -D]则代表是左上角,即135度方向),GLCM中的每一个元素(i,j)代表灰度i与灰度j在图像中水平相邻的次数。

    因为动态地求取图像的GLCM区间代价过高,我们便首先将灰度值转换到I的灰度区间里。如果I是一个二值图像,那么灰度共生矩阵就将图像转换到两级。如果I是一个灰度图像, 那将转换到8级。灰度的级数决定了GLCM的大小尺寸。你可以通过设定参数“NumLevels”来指定灰度的级数,还可以通过设置“GrayLimits"参数来设置灰度共生矩阵的转换方式。

    下图显示了如何求解灰度共生矩阵,以(1,1)点为例,GLCM(1,1)值为1说明只有一对灰度为1的像素水平相邻。GLCM(1,2)值为2,是因为有两对灰度为1和2的像素水平相邻。

    glcms = graycomatrix(I,param1,val1,param2,val2,...) 返回一个或多个灰度灰度共生矩阵,根据指定的参数。参数可以很简短,并且对大小写不敏感。

    参数

    'GrayLimits'  是两个元素的向量,表示图像中的灰度映射的范围,如果其设为[],灰度共生矩阵将使用图像I的最小及最大灰度值作为GrayLimits

    'NumLevels'    一个整数,代表是将图像中的灰度归一范围。举例来说,如果NumLevels为8,意思就是将图像I的灰度映射到1到8之间,它也决定了灰度共生矩阵的大小

    'Offset'   上面有解释,是一个p*2的整数矩阵,D代表是当前像素与邻居的距离,通过设置D值,即可设置角度
    Angle        Offset
      0              [0 D]
     45             [-D D]
     90             [-D 0]
    135            [-D -D]

    示例:

    计算灰度共生矩阵,并且返回缩放后的图像,SI
    I = [ 1 1 5 6 8 8; 2 3 5 7 0 2; 0 2 3 5 6 7];
    [glcm,SI] = graycomatrix(I,'NumLevels',9,'G',[])

    计算灰度图像的灰度共生矩阵
    I = imread('circuit.tif');
    glcm = graycomatrix(I,'Offset',[2 0]);

    灰度共生矩阵的特征:

    角二阶矩(Angular Second Moment, ASM)
    ASM=sum(p(i,j).^2)    p(i,j)指归一后的灰度共生矩阵
    角二阶矩是图像灰度分布均匀程度和纹理粗细的一个度量,当图像纹理绞细致、灰度分布均匀时,能量值较大,反之,较小。

    熵(Entropy, ENT)
    ENT=sum(p(i,j)*(-ln(p(i,j)))    
    是描述图像具有的信息量的度量,表明图像的复杂程序,当复杂程序高时,熵值较大,反之则较小。

    反差分矩阵(Inverse Differential Moment, IDM)
    IDM=sum(p(i,j)/(1+(i-j)^2))
    反映了纹理的清晰程度和规则程度,纹理清晰、规律性较强、易于描述的,值较大;杂乱无章的,难于描述的,值较小。

    1. #define GLCM_DIS 3  //灰度共生矩阵的统计距离   
    2. #define GLCM_CLASS 16 //计算灰度共生矩阵的图像灰度值等级化   
    3. #define GLCM_ANGLE_HORIZATION 0  //水平   
    4. #define GLCM_ANGLE_VERTICAL   1  //垂直   
    5. #define GLCM_ANGLE_DIGONAL    2  //对角   
    6. int calGLCM(IplImage* bWavelet,int angleDirection,double* featureVector)  
    7. {  
    8.     int i,j;  
    9.     int width,height;  
    10.   
    11.     if(NULL == bWavelet)  
    12.         return 1;  
    13.   
    14.     width = bWavelet->width;  
    15.     height = bWavelet->height;  
    16.   
    17.     int * glcm = new int[GLCM_CLASS * GLCM_CLASS];  
    18.     int * histImage = new int[width * height];  
    19.   
    20.     if(NULL == glcm || NULL == histImage)  
    21.         return 2;  
    22.   
    23.     //灰度等级化---分GLCM_CLASS个等级   
    24.     uchar *data =(uchar*) bWavelet->imageData;  
    25.     for(i = 0;i < height;i++){  
    26.         for(j = 0;j < width;j++){  
    27.             histImage[i * width + j] = (int)(data[bWavelet->widthStep * i + j] * GLCM_CLASS / 256);  
    28.         }  
    29.     }  
    30.   
    31.     //初始化共生矩阵   
    32.     for (i = 0;i < GLCM_CLASS;i++)  
    33.         for (j = 0;j < GLCM_CLASS;j++)  
    34.             glcm[i * GLCM_CLASS + j] = 0;  
    35.   
    36.     //计算灰度共生矩阵   
    37.     int w,k,l;  
    38.     //水平方向   
    39.     if(angleDirection == GLCM_ANGLE_HORIZATION)  
    40.     {  
    41.         for (i = 0;i < height;i++)  
    42.         {  
    43.             for (j = 0;j < width;j++)  
    44.             {  
    45.                 l = histImage[i * width + j];  
    46.                 if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width)  
    47.                 {  
    48.                     k = histImage[i * width + j + GLCM_DIS];  
    49.                     glcm[l * GLCM_CLASS + k]++;  
    50.                 }  
    51.                 if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width)  
    52.                 {  
    53.                     k = histImage[i * width + j - GLCM_DIS];  
    54.                     glcm[l * GLCM_CLASS + k]++;  
    55.                 }  
    56.             }  
    57.         }  
    58.     }  
    59.     //垂直方向   
    60.     else if(angleDirection == GLCM_ANGLE_VERTICAL)  
    61.     {  
    62.         for (i = 0;i < height;i++)  
    63.         {  
    64.             for (j = 0;j < width;j++)  
    65.             {  
    66.                 l = histImage[i * width + j];  
    67.                 if(i + GLCM_DIS >= 0 && i + GLCM_DIS < height)   
    68.                 {  
    69.                     k = histImage[(i + GLCM_DIS) * width + j];  
    70.                     glcm[l * GLCM_CLASS + k]++;  
    71.                 }  
    72.                 if(i - GLCM_DIS >= 0 && i - GLCM_DIS < height)   
    73.                 {  
    74.                     k = histImage[(i - GLCM_DIS) * width + j];  
    75.                     glcm[l * GLCM_CLASS + k]++;  
    76.                 }  
    77.             }  
    78.         }  
    79.     }  
    80.     //对角方向   
    81.     else if(angleDirection == GLCM_ANGLE_DIGONAL)  
    82.     {  
    83.         for (i = 0;i < height;i++)  
    84.         {  
    85.             for (j = 0;j < width;j++)  
    86.             {  
    87.                 l = histImage[i * width + j];  
    88.   
    89.                 if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width && i + GLCM_DIS >= 0 && i + GLCM_DIS < height)  
    90.                 {  
    91.                     k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS];  
    92.                     glcm[l * GLCM_CLASS + k]++;  
    93.                 }  
    94.                 if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width && i - GLCM_DIS >= 0 && i - GLCM_DIS < height)  
    95.                 {  
    96.                     k = histImage[(i - GLCM_DIS) * width + j - GLCM_DIS];  
    97.                     glcm[l * GLCM_CLASS + k]++;  
    98.                 }  
    99.             }  
    100.         }  
    101.     }  
    102.   
    103.     //计算特征值   
    104.     double entropy = 0,energy = 0,contrast = 0,homogenity = 0;  
    105.     for (i = 0;i < GLCM_CLASS;i++)  
    106.     {  
    107.         for (j = 0;j < GLCM_CLASS;j++)  
    108.         {  
    109.             //熵   
    110.             if(glcm[i * GLCM_CLASS + j] > 0)  
    111.                 entropy -= glcm[i * GLCM_CLASS + j] * log10(double(glcm[i * GLCM_CLASS + j]));  
    112.             //能量   
    113.             energy += glcm[i * GLCM_CLASS + j] * glcm[i * GLCM_CLASS + j];  
    114.             //对比度   
    115.             contrast += (i - j) * (i - j) * glcm[i * GLCM_CLASS + j];  
    116.             //一致性   
    117.             homogenity += 1.0 / (1 + (i - j) * (i - j)) * glcm[i * GLCM_CLASS + j];  
    118.         }  
    119.     }  
    120.     //返回特征值   
    121.     i = 0;  
    122.     featureVector[i++] = entropy;  
    123.     featureVector[i++] = energy;  
    124.     featureVector[i++] = contrast;  
    125.     featureVector[i++] = homogenity;  
    126.   
    127.     delete[] glcm;  
    128.     delete[] histImage;  
    129.     return 0;  
    130. }  
  • 相关阅读:
    批量导入
    循环语句
    判断循环常见
    常见C运算符
    oc将字符串中单词按照出现次数(次数都不一样)降序排序,排序之后单词只出现一次,源字符串中单词用下划线连接,生成字符串也用下滑线连接
    把字符串中的字母大小写反转OC
    查找子串出现次数OC
    现有一个数组NSMutableArray, 数组有若干个NSString的元素,进行选择法排序
    终端的一些命令
    编程语言名字来历
  • 原文地址:https://www.cnblogs.com/xuepei/p/3942363.html
Copyright © 2020-2023  润新知