图像处理 灰度共生阵

2014-05-18 00:20:39 light_lj 阅读数 35216

灰度共生矩阵(Gray-level Co-occurrence Matrix,GLCM)

又叫做灰度共现矩阵

概念:

像素灰度在空间位置上的反复出现形成图像的纹理,GLCM是描述具有某种空间位置关系两个像素灰度的联合分布

含义:

就是两个像素灰度的联合直方图,是一种二阶统计量

就是两个像素点的关系。像素关系可以根据不同的纹理特性进行选择,也就是的大小可以自由选

像素的空间位置关系:

取。对于较细的纹理分析可以取像素间距为1,是水平扫描;是垂直扫描;是45度扫描;是180度扫描。一旦位置空间确定,就可以生成灰度共生矩阵。

矩阵的物理意义:

表示灰度共生矩阵,它是一个的矩阵(L为灰度级,就是一幅图中包含的不同灰度或者颜色的个数),是具有空间位置关系且灰度分别为i和j的两个像素出现的次数或频率(归一化)

例如: 下图是某纹理像素的放大,和对应的像素灰度矩阵


此图像只有三种灰度,故灰度级为3,灰度共生矩阵是一个3*3的矩阵


归一化形式为

改变位置空间的定义,灰度共生矩阵相应地改变:


归一化形式为:


矩阵的特征量:

从灰度共生矩阵上可以简单的看出,如果对角附近的元素有较大的值,说明图像的像素具有相似的像素值,如果偏离对角线的元素会有比较大的值,说明像素灰度在局部有较大变化。为了得到更多的纹理特征,我们还需要在进行计算:

对比度)(或反差)(contrast):

纹理沟纹越深,其对比度越大,视觉效果越清晰;反之,对比度小,则沟纹浅,效果模糊。灰度差即对比度大的象素对越多,这个值越大。灰度公生矩阵中远离对角线的元素值越大,con越大。所以con越大图像越清晰


相关度(inverse different moment):

度量空间灰度共生矩阵元素在行或列方向上的相似程度,因此,相关值大小反映了图像中局部灰度相关性。当矩阵元素值均匀相等时,相关值就大;相反,如果矩阵像元值相差很大则相关值小。


能量:是灰度共生矩阵元素值的平方和,所以也称之为能量,反映了图像灰度分布均匀程度和纹理粗细度。ASM值大表明一种较均一和规则变化的纹理模式。


熵(entropy):熵在物理中的含义就是物体的规则度,越有序熵越小,越无序熵越大。此处熵同样表示图像的信息量,当共生矩阵中所有元素有最大的随机性、空间共生矩阵中所有值几乎相等时,共生矩阵中元素分散分布时,熵较大。它表示了图像中纹理的非均匀程度或复杂程度。

自相关(correlation):反应了图像纹理的一致性。如果图像中有水平方向纹理,则水平方向矩阵的COR大于其余矩阵的COR值。


补充:

当灰度级较大时,是一个庞大的矩阵。对于一般的灰度图,灰度级就有256,那么中就有个元素,如此庞大的矩阵会使后续的计算量增加,所以灰度共生矩阵一般要经过处理以减少灰度级数,比如通过分析纹理图像直方图,在不影响图像纹理质量的前提下,经过适当的变换压缩灰度级。

参考:

《数字图像处理与计算机视觉:visual C++与Matlab实现》章挣

图像算法】图像特征:GLCM

百度百科:灰度共生矩阵


2019-06-30 22:37:17 aidem_brown 阅读数 1209

标准定义如下:对于取定的方向θ 和距离 d, 在方向为θ的直线上, 一个像元灰度为 i, 另一个与其相距为 d

像元的灰度为 j 的点对出现的频数即为灰度共生矩阵第(i, j)阵元的值。

怎样理解呢?看起来好复杂呀  呜呜呜

小白理解:灰度共生矩阵就是整幅图像中,按照一定的平移方向,相距为d的两个像素同时出现的联合概率密度分布。

怎么样?还是没办法深入理解

那就上图吧

怎样理解呢?

在上图中,我定义的灰度级别是8,所以在右边的灰度统计矩阵中就是8*8(拓展:如果灰度级别是k,则灰度统计矩阵就是k*k啦)。看图很明白,左图中定义的d肯定是1,平移方向当然是水平的啦。

看到这里应该算是有大概理解了吧。

那就开始正式上菜吧

取图像(N×N)中任意一点 (x,y)及偏离它的另一点 (x+a,y+b),设该点对的灰度值为 (g1,g2)。令点(x,y) 在整个画面上移动,则会得到各种 (g1,g2)值,设灰度值的级数为 k,则(g1,g2) 的组合共有 k 的平方种。对于整个画面,统计出每一种 (g1,g2)值出现的次数,然后排列成一个方阵,再用(g1,g2) 出现的总次数将它们归一化为出现的概率P(g1,g2) ,这样的方阵称为灰度共生矩阵。距离差分值(a,b) 取不同的数值组合,可以得到不同情况下的联合概率矩阵。(a,b) 取值要根据纹理周期分布的特性来选择,对于较细的纹理,选取(1,0)、(0,1)、(1,1)、(-1,1)等小的差分值。

当 a=1,b=0时,像素对是水平的,即0度扫描;当a=0,b=1 时,像素对是垂直的,即90度扫描;当 a=1,b=1时,像素对是右对角线的,即45度扫描;当 a=-1,b=1时,像素对是左对角线,即135度扫描。

综上,两个象素灰度级同时发生的概率,就将 (x,y)的空间坐标转化为"灰度对" (g1,g2)的描述,形成了灰度共生矩阵。

补充一下:归一化公式


--------------------- 
作者:离原青草 
来源:CSDN 
原文:https://blog.csdn.net/yanghui0025/article/details/79703669 
版权声明:本文为博主原创文章,转载请附上博文链接!

-----------------------------------------------------------------------------------------------------------------------------------------------------

灰度共生矩阵(GLDM)的统计方法是20世纪70年代初由R.Haralick等人提出的,它是在假定图像中各像素间的空间分布关系包含了图像纹理信息的前提下,提出的具有广泛性的纹理分析方法。

灰度共生矩阵被定义为从灰度为i的像素点出发,离开某个固定位置(相隔距离为d,方位为)的点上灰度值为的概率,即,所有估计的值可以表示成一个矩阵的形式,以此被称为灰度共生矩阵。对于纹理变化缓慢的图像,其灰度共生矩阵对角线上的数值较大;而对于纹理变化较快的图像,其灰度共生矩阵对角线上的数值较小,对角线两侧的值较大。由于灰度共生矩阵的数据量较大,一般不直接作为区分纹理的特征,而是基于它构建的一些统计量作为纹理分类特征。Haralick曾提出了14种基于灰度共生矩阵计算出来的统计量:即:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。

本文是借用一篇文章的例子讲解灰度共生矩阵,用文字说明感觉说不清,自己之前用该方法做过实验,还是会忘,所以干脆用例子的方式介绍,下一次再看也容易理解。

在图像中任意一点(x,y)及偏离它的一点(x+a,y+b)(其中a,b为整数,认为定义)构成点对。设该点对的灰度值为(f1,f2),假设图像的最大灰度级为L,则f1与f2的组合共有L*L种。对于整福图像,统计每一种(f1,f2)值出现的次数,然后排列成一个方阵,再用(f1,f2)出现的总次数将它们归一化为出现的概率P(f1,f2),由此产生的矩阵为灰度共生矩阵。

下图为一个简单的例子:

图a为原图像,最大灰度级为16。为表示方便,这里将灰度级数减小为4级,图a变为图b的形式。这样(f1,f2)取值范围便为[0,3]。取不同的间隔,将(f1,f2)各种组合出现的次数排列起来,就可得到图e~g所示的灰度共生矩阵。

图e表示图b中(x,y)与偏离它的(x+1,y+0)构成点对时,(f1,f2)取值的情况(填充黄色部分为f1取0,f2取1时的情况,由图b填充易知共10种)。同理,f,g分别表示图c,d中(x,y)分别于点(x+1,y+1),(x+2,y+0)构成的点对(f1,f2)出现的情况(图c填充黄色部分表示f1取0,f2取0时,对角线点对(0,0)出现的情况,共8种:图d填充黄色部分表示f1取0,f2取2时水平点对(0,2)出现的情况,共9种)。例如,对于a=1,b=0,点对中(0,1)的组合共出现了10次。对比可以看出,(0,1),(1,2),(2,3)和(3,0)均有较高的出现频数。图b表明,图像中存在明显的左上右下方向的纹理。

距离(a,b)的取值不同,灰度共生矩阵中的值不同。a和b的取值要根据纹理周期分布的特征来选择,对于较细的纹理,选取(1,0),(1,1),(2,0)等这样的值是有必要的。a,b取值较小对应于变化缓慢的纹理图像,其灰度共生矩阵对角线上的数值较大。纹理的变化越快,则对角线上的数值越小,而对角线两侧的值增大。

共生矩阵实际上是两个像素点的联合直方图,对于图像中细而规则的纹理,成对像素点的二维直方图倾向于均匀分布;对于粗而规则的纹理,则倾向于最对角分布。

2.灰度共生矩阵特征量

2.1对比度

度量 矩阵的值是如何分布和图像中局部变化的多少,反应了图像的清晰度和纹理的沟纹深浅。纹理的沟纹越深,反差越大,效果越清晰;反之,对比值小,则沟纹浅,效果模糊。

2.2 能量

能量变换反映了图像灰度分布均匀程度和纹理粗细度。若灰度共生矩阵的元素值相近,则能量较小,表示纹理细致;若其中一些值大,而其它值小,则能量值较大。能量值大表明一种较均一和规则变化的纹理模式。

2.3 熵

图像包含信息量的随机性度量。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大;因此熵值表明了图像灰度分布的复杂程度,熵值越大,图像越复杂。

2.4 逆方差

逆方差反映了图像纹理局部变化的大小,若图像纹理的不同区域间较均匀,变化缓慢,逆方差会较大,反之较小。

2.5相关性

用来度量图像的灰度级在行或列方向上的相似程度,因此值得大小反应了局部灰度相关性,值越大,相关性也越大。

2016-01-17 16:20:26 shenziheng1 阅读数 2234

1.图像共生矩阵的用途

纹理特征提取的一种有效方法是以灰度级的空间相关矩阵及共生矩阵为基础的。因为图像中相距(△x,△y)的两个灰度像素同时出现联合频率分布可以用灰度共生矩阵来表示。若图像的灰度定为N级,那么共生矩阵为N*N矩阵,可以表示为M(△x,△y)(g1,g2)。其中,位于(g1,g2)的元素M值表示一个为g1,而另一个灰度为g2的两个距离为(△x,△y)的像素对出现的次数。
对粗纹理的区域,其灰度共生矩阵中的M较集中于主对角线附近。因为对于粗文理,像素对趋于具有相同的灰度。而对于细纹里的区域,其灰度共生矩阵中的M值则分散在各处。

2.具体理解图像共生矩阵

定义:对图像上保持某距离的两个像素分别具有某灰度状况进行统计得到的。
取图像(N*N)中任意一点(x,y)以及偏离它的另一点(x+△x,y+△y),记下该点对灰度值为(g1,g2)。令点(x,y)在整个画面上移动,则会得到各种(g1,g2)值。设灰度值的级数为L,则(g1,g2)的组合共有L*L种。对于整个画面,统计出每一种(g1,g2)值出现的次数,然后排列成一个方阵,再用(g1,g2)出现的总次数求得归一化概率P(g1,g2),这样的方阵就是我们常说的灰度共生矩阵。距离差分值(△x,△y)去不同的数值组合,可以得到不同情况下的联合概率矩阵。(△x,△y)的取值要根据纹理周期分布的特性来选择。对于较细的纹理,选取(1,0)、(1,1)、(2,0)等较小的差分值。
当采用(1,0)时,像素对是水平的,即0度扫描;当采用(0,1)时,像素对是垂直的,即90度扫描;当采用(1,1)时,像素对是右对角线的,即45度扫描。当采用(-1,-1)时,像素是做对角线的,即135度扫描。
这样,通过计算两个位置的像素的联合概率密度,就将(x,y)空间坐标转化为“灰度对”(g1,g2)的描述,形成灰度共生矩阵。共生矩阵用两个位置的像素的两盒概率密度来定义,他不仅反映亮度的分布特性,也反映具有相同亮度或接近亮度的像素之间的位置分布特性,是关于图像亮度变化的二阶统计特征。

3.意义

一幅图像的灰度共生矩阵能反映出图像灰度关于方向、相邻间隔、变化幅度的综合信息,是分析图像的局部模式和他们排列规则的基础。


2010-07-09 18:02:00 weiyuweizhi 阅读数 64560

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))
反映了纹理的清晰程度和规则程度,纹理清晰、规律性较强、易于描述的,值较大;杂乱无章的,难于描述的,值较小。

2018-06-06 18:26:09 qq_23926575 阅读数 5809

本篇博客参考灰度共生矩阵(GLCM)附Python代码 ,对其进行了完善与修改。

非常感谢评论区 清慎Arthurjy2lhz小小菜鸡升级ing 指出代码中的问题,目前已根据建议进行修改和优化。2019-01-07

灰度共生矩阵(Gray Level Co-occurrence Matrix,GLCM)统计了灰度图中像素间的灰度值分布规律以区分不同的纹理。灰度共生矩阵中每个元素的值可以定义为(x, y)点与(x + dx, y + dy)点的值对为(i, j)的概率。统计整幅图像中每一种灰度值组合出现的概率矩阵 P 即为灰度共生矩阵。

引自百度百科 灰度共生矩阵
灰度级量化
在实际应用中,一幅灰度影像的灰度级一般为256级,在计算由灰度共生矩阵推导出的纹理特征时,要求影像的灰度级远小于256,主要是因为影像共生矩阵的计算量由影像的灰度等级和影像的大小来确定。例如:假定影像G有L个灰度级,其大小为R行C列,则运算量大约是L² * R * C,按一般情况L=256, R=512, C=512来计算,其基本运算至少要1.7 * 10十次方次。以现行微机的运算速度每秒100万次为例,对上述一幅影像计算其灰度共生矩阵至少需要1.7 X 10³秒以上,约30分钟。由此可见,这样长的时间用来进行影像的识别是不太切合实际的。解决的办法是:在尽量保持影像原形的情况下大量削减影像灰度级的取值个数和影像分辨率。因此在计算空间灰度共生矩阵时,在不影响纹理特征的前提下往往先将原影像的灰度级压缩到较小的范围,一般取8级或16级,以便减小共生矩阵的尺寸。
因为灰度级由256变为了8级,所以影像颜色显得很暗淡。但是在进行纹理信息处理时对纹理特征的影响不大。

一张图像的灰度值范围一般为0-255,为减少计算量,在计算矩阵前,需要对灰度值进行量化,一般可设置为8, 16.由于灰度共生矩阵的维度较大,一般不直接作为区分纹理的特征,而是基于它构建的一些统计量作为纹理分类特征。例如Haralick曾提出了14种基于灰度共生矩阵计算出来的统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。

# -*- coding: utf-8 -*-
import cv2
import numpy as np
np.set_printoptions(suppress=True)

def glcm(arr, d_x, d_y, gray_level=16):
    '''计算并返回归一化后的灰度共生矩阵'''
    max_gray = arr.max()
    height, width = arr.shape
    arr = arr.astype(np.float64)  # 将uint8类型转换为float64,以免数据失真
    arr = arr * (gray_level - 1) // max_gray  # 若灰度级数大于gray_level,则将图像的灰度级缩小至gray_level,减小灰度共生矩阵的大小。量化后灰度值范围:0 ~ gray_level - 1
    ret = np.zeros([gray_level, gray_level])
    for j in range(height -  abs(d_y)):
        for i in range(width - abs(d_x)):  # range(width - d_x)  #注释为源代码,经评论指出错误后修改
            rows = arr[j][i].astype(int)
            cols = arr[j + d_y][i + d_x].astype(int)
            ret[rows][cols] += 1
    if d_x >= d_y:
        ret = ret / float(height * (width - 1))  # 归一化, 水平方向或垂直方向
    else:
        ret = ret / float((height - 1) * (width - 1))  # 归一化, 45度或135度方向
    return ret

if __name__=='__main__':
    '''归一化时分母值根据角度theta变化,0度或90度时为height * (width - 1), 45度或135度时为(height - 1) * (width - 1)'''
    fp = 'C:/Users/mamq/Pictures/test photos/house_1.jpg'
    img = cv2.imread(fp)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图像,uint8
    glcm_0 = glcm(img_gray, 1, 0)  # 水平方向
    # glcm_1 = glcm(img_gray, 0, 1)  # 垂直方向
    # glcm_2 = glcm(img_gray, 1, 1)  # 45度方向
    # glcm_3 = glcm(img_gray, -1, 1)  # 135度方向

部分结果

[[0.0084385 0.00192513 0.00074866 0.00050802 0.00043316 0.00040107
0.00056684 0.00029947 0.00019786 0.00020856 0.00006417 0.00003209
0.00003743 0.00005348 0.00004813 0.00003209]
[0.0019893 0.00362032 0.00148128 0.00079679 0.00071658 0.00060428
0.00040107 0.00027807 0.00026738 0.00017112 0.00005882 0.00006417
0.00002139 0.00003743 0.00002139 0.00005882]
……
]


以上,欢迎批评指正