灰度共生矩阵(GLCM)附Python代码

本文介绍了灰度共生矩阵(GLCM)的基本概念及其在图像纹理分析中的应用。详细阐述了GLCM的构造方法,并通过几个典型统计量(如角二阶矩、熵、对比度和反差分矩阵)来量化图像纹理特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文献:Textural Features for Image Classification1.

代码地址:https://github.com/Code-0x00/pyCV

简介

灰度共生矩阵(Gray-Level Co-occurrence Matrix,GLCM)统计了灰度图中像素间的灰度值分布规律以区分不同的纹理。

度共生矩阵可以定义为一个灰度为 i i i的像素点与另一个与之对应位置上的像素点的灰度值为 j j j的概率。那么所有估计的值可以表示成一个矩阵的形式,以此被称为灰度共生矩阵。如:根据图像中任意一点 ( x , y ) (x,y) (x,y) 的灰度值和它所对应的点 ( x + d x , y + d y ) (x+d_x,y+d_y) (x+dx,y+dy) 的灰度值可以得到一个灰度值组合 ( g 1 , g 2 ) (g_1,g_2) (g1,g2)。统计整福图像每一种灰度值组合出现的概率矩阵 P P P 即为灰度共生矩阵。

由于灰度共生矩阵的维度较大,一般不直接作为区分纹理的特征,而是基于它构建的一些统计量作为纹理分类特征。例如 H a r a l i c k Haralick Haralick曾提出了14种基于灰度共生矩阵计算出来的统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。

举例几种常用的统计值

1.角二阶矩(Angular Second Moment, ASM)

角二阶矩又称能量,是图像灰度分布均匀程度和纹理粗细的一个度量,反映了图像灰度分布均匀程度和纹理粗细度。当图像纹理均一规则时,能量值较大;反之灰度共生矩阵的元素值相近,能量值较小。
A S M = ∑ i ∑ j P ( i , j ) 2 ASM = \sum_i\sum_jP(i,j)^2 ASM=ijP(i,j)2

2.熵(Entropy, ENT)

熵度量了图像包含信息量的随机性,表现了图像的复杂程度。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大。
E N T = − ∑ i ∑ j P ( i , j ) l o g ( P ( i , j ) ) ENT = -\sum_i\sum_jP(i,j)log(P(i,j)) ENT=ijP(i,j)log(P(i,j))

3.对比度

对比度反应了图像的清晰度和纹理的沟纹深浅。纹理越清晰反差越大对比度也就越大。
C o n = ∑ i ∑ j ( i − j ) 2 P ( i , j ) Con = \sum_i\sum_j(i-j)^2P(i,j) Con=ij(ij)2P(i,j)

4.反差分矩阵(Inverse Differential Moment, IDM)

反差分矩阵又称逆方差,反映了纹理的清晰程度和规则程度,纹理清晰、规律性较强、易于描述的,值较大。
I D M = ∑ i ∑ j P ( i , j ) 1 + ( i − j ) 2 IDM = \sum_i\sum_j\dfrac{P(i,j)}{1+(i-j)^2} IDM=ij1+(ij)2P(i,j)

Python 代码如下

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cv2
import math

#定义最大灰度级数
gray_level = 16

def maxGrayLevel(img):
    max_gray_level=0
    (height,width)=img.shape
    print height,width
    for y in range(height):
        for x in range(width):
            if img[y][x] > max_gray_level:
                max_gray_level = img[y][x]
    return max_gray_level+1

def getGlcm(input,d_x,d_y):
    srcdata=input.copy()
    ret=[[0.0 for i in range(gray_level)] for j in range(gray_level)]
    (height,width) = input.shape
    
    max_gray_level=maxGrayLevel(input)
    
    #若灰度级数大于gray_level,则将图像的灰度级缩小至gray_level,减小灰度共生矩阵的大小
    if max_gray_level > gray_level:
        for j in range(height):
            for i in range(width):
                srcdata[j][i] = srcdata[j][i]*gray_level / max_gray_level

    for j in range(height-d_y):
        for i in range(width-d_x):
             rows = srcdata[j][i]
             cols = srcdata[j + d_y][i+d_x]
             ret[rows][cols]+=1.0

    for i in range(gray_level):
        for j in range(gray_level):
            ret[i][j]/=float(height*width)

    return ret

def feature_computer(p):
    Con=0.0
    Eng=0.0
    Asm=0.0
    Idm=0.0
    for i in range(gray_level):
        for j in range(gray_level):
            Con+=(i-j)*(i-j)*p[i][j]
            Asm+=p[i][j]*p[i][j]
            Idm+=p[i][j]/(1+(i-j)*(i-j))
            if p[i][j]>0.0:
                Eng+=p[i][j]*math.log(p[i][j])
    return Asm,Con,-Eng,Idm

def test(image_name):
    img = cv2.imread(image_name)
    try:
        img_shape=img.shape
    except:
        print 'imread error'
        return

    img=cv2.resize(img,(img_shape[1]/2,img_shape[0]/2),interpolation=cv2.INTER_CUBIC)

    img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    glcm_0=getGlcm(img_gray, 1,0)
    #glcm_1=getGlcm(src_gray, 0,1)
    #glcm_2=getGlcm(src_gray, 1,1)
    #glcm_3=getGlcm(src_gray, -1,1)

    asm,con,eng,idm=feature_computer(glcm_0)

    return [asm,con,eng,idm]

if __name__=='__main__':
    result = test("test.bmp")
    print(result)

参考文献


  1. Haralick R M, Shanmugam K, Dinstein I. Textural Features for Image Classification[J]. Systems Man & Cybernetics IEEE Transactions on, 1973, smc-3(6):610-621. ↩︎

<think>好的,用户想在Python中使用灰度共生矩阵GLCM)进行图像纹理分析。我需要详细解释实现的步骤,并确保符合用户提供的系统级指令,比如正确使用LaTeX格式和引用相关资源。首先,我需要回顾一下GLCM的基本概念,然后分步骤讲解如何用Python实现,包括预处理、计算GLCM、提取特征等环节。 首先,灰度共生矩阵的定义。根据引用[1],GLCM是描述图像纹理的一种方法,通过统计像素对的灰度值在特定空间关系下的共现情况。数学上,GLCM的元素$P(i,j)$表示在方向$\theta$和距离$d$下,灰度值为i的像素与灰度值为j的像素相邻出现的次数。这需要用LaTeX表达,比如定义部分用行内公式,而独立公式用$$...$$格式。 接下来,用户可能需要具体的代码实现。根据引用[3],提到可以使用skimage库的greycomatrix和greycoprops函数。我需要详细说明如何导入库、读取图像、预处理(比如转换为灰度图)、计算GLCM,然后提取对比度、能量等特征。同时,要处理参数如距离、方向的选择,比如常用的距离为1,角度为0°, 45°, 90°, 135°。 另外,引用[4]提到有一个GLCM工具包,但用户可能更倾向于使用常见的库如scikit-image,所以主要介绍skimage的方法。同时,要注意代码示例的正确性,比如使用cv2.imread读取图像,可能需要处理路径问题,或者建议使用其他库如PIL。 预处理步骤中,可能需要将图像转换为灰度图,并且标准化灰度级。例如,将图像量化为8个灰度级,这可以通过np.digitize或直接除以一个系数来实现。这部分需要详细说明,因为不同的量化会影响GLCM的结果。 在计算GLCM时,skimage的greycomatrix返回的是一个4D数组,需要解释各个维度的含义,比如角度和距离的不同组合。然后使用greycoprops提取各个纹理特征,比如对比度、能量等,需要说明每个特征的意义,如对比度反映图像的清晰程度,能量代表均匀性等。 此外,用户可能需要了解如何选择参数,比如距离和角度的不同组合对结果的影响,以及如何处理多角度的结果(取平均)。同时,代码示例需要完整,包括导入库、读取图像、预处理、计算和特征提取的全过程。 最后,生成相关问题需要考虑用户可能的进一步需求,比如参数调优、不同特征的应用场景、处理多通道图像的方法,以及性能优化的技巧。需要确保问题与主题相关,帮助用户深入理解GLCM的应用。 总结步骤: 1. 导入必要的库(skimage, cv2, numpy)。 2. 读取图像并转换为灰度。 3. 预处理(调整大小、量化灰度级)。 4. 计算GLCM矩阵。 5. 提取纹理特征。 6. 分析和应用结果。 同时,需要检查LaTeX格式是否正确,例如行内公式用$...$,独立公式如GLCM定义用$$...$$,并确保引用正确,如引用[1]、[3]等。此外,回答结构要清晰,分步骤说明,代码示例正确,参数解释清楚,帮助用户逐步实现目标。</think>以下是在Python中使用灰度共生矩阵GLCM)进行图像纹理分析的完整实现指南,结合引用内容和实际代码示例: --- ### 一、灰度共生矩阵GLCM)原理 灰度共生矩阵定义为在特定空间关系(距离$d$和方向$\theta$)下,灰度值为$i$的像素与灰度值为$j$的像素共同出现的概率: $$ P(i,j|d,\theta) = \frac{N(i,j)}{\sum_{i=1}^{k}\sum_{j=1}^{k}N(i,j)} $$ 其中$N(i,j)$是共现次数,$k$为量化后的灰度级数[^1]。 --- ### 二、Python实现步骤 #### 1. 环境准备 ```python import cv2 import numpy as np from skimage.feature import greycomatrix, greycoprops ``` #### 2. 图像预处理 ```python # 读取并转换为灰度图 image = cv2.imread("texture.jpg", cv2.IMREAD_GRAYSCALE) # 调整大小并量化灰度级(8级) image = cv2.resize(image, (256, 256)) bins = np.array([0, 32, 64, 96, 128, 160, 192, 224, 255]) quantized = np.digitize(image, bins) - 1 # 结果为0-7的整数 ``` #### 3. 计算GLCM矩阵 ```python # 参数设置:距离=1,角度=[0°,45°,90°,135°] distances = [1] angles = [0, np.pi/4, np.pi/2, 3*np.pi/4] glcm = greycomatrix(quantized, distances, angles, levels=8, symmetric=True) ``` #### 4. 提取纹理特征 ```python contrast = greycoprops(glcm, 'contrast').mean() energy = greycoprops(glcm, 'energy').mean() correlation = greycoprops(glcm, 'correlation').mean() homogeneity = greycoprops(glcm, 'homogeneity').mean() print(f"对比度: {contrast:.2f}, 能量: {energy:.2f}, 相关性: {correlation:.2f}, 同质性: {homogeneity:.2f}") ``` --- ### 三、关键参数说明 1. **灰度级数**:通常取8/16级,过少会丢失细节,过多会增加计算量[^3] 2. **方向选择**:多方向计算后取平均值可增强特征鲁棒性 3. **距离选择**:根据纹理粗细调整,细纹理用$d=1$,粗纹理用$d=2-5$ --- ### 四、应用场景 - 医学影像:肿瘤组织识别 - 工业检测:材料表面缺陷识别 - 遥感分析:地表覆盖分类[^2] ---
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值