灰度共生矩阵(GLCM, Gray-level co-occurrence matrix) 是一种灰度图像纹理特征提取的方法, 是目前最常见、应用最广泛、效果最好的一种纹理统计分析方法之一, Haralick 简介 灰度共生矩阵法(GLCM, Gray-level co-occurrence matrix),就是通过计算灰度图像得到它的共生矩阵,然后透过计算该共生矩阵得到矩阵的部分特征值,来分别代表图像的某些纹理特征 GLCM 灰度共生矩阵 定义 灰度共生矩阵是一个统计描述影像中的一个局部区域或整个区域相邻象元或一定间距内两象元灰度呈现某种关系的矩阵。 基于GLCM的纹理分析需要综合考虑以下几个因素: 图像的灰度级 光谱波段 不同特征值选择 移动方向 窗口大小和移动步长(基于像素GLCM计算中) 示例 棋盘格图像: 定义两种方向 d 后,计算共生矩阵: 当GLCM中元素分布较集中于主对角线附近时,说明局部区域内图像灰度分布较均匀,ASM取值相应较大;相反,如果共生矩阵的所有值均相等,则ASM值较小。
0度水平方向GLCM 45度方向GLCM 90度垂直方向GLCM 135度方向GLCM 根据相邻像素点之间距离参数D不同可以得到不同距离的GLCM。 上述5个是常见的GLCM的纹理特征,GLCM总计由14个特征值输出,这里就不再赘述了!感兴趣的可以自己搜索关键字GLCM。 _135.at<float>(i, j)++; } } normalize(glcm_0, glcm_0, 0, 1.0, NORM_MINMAX); normalize(glcm_45, glcm _45, 0, 1.0, NORM_MINMAX); normalize(glcm_90, glcm_90, 0, 1.0, NORM_MINMAX); normalize(glcm_135, glcm _0.at<float>(row, col) = pv; } } normalize(glcm_0, glcm_0, 0, 1.0, NORM_MINMAX); imshow("glcm", glcm
(MatLab说明文档) GLCM表其实就是所有像素可能的组合,比如,GLCM(1,1)就是I中像素值为1和1的组合,GLCM(4,5)就是I中像素4和像素5的组合,GLCM(i,j)的值呢就是 { public: GLCM(); ~GLCM(); public: // 枚举灰度共生矩阵的方向 enum { GLCM_HORIZATION = 0, // 水平 GLCM_VERTICAL #include "GLCM.h" GLCM::GLCM() : m_grayLevel(16) { } GLCM::~GLCM() { } //=========================== glcm; VecGLCM vec; GLCMFeatures features; glcm.initGLCM(vec); // 水平 glcm.calGLCM(img, vec, GLCM::GLCM_HORIZATION (img, vec, GLCM::GLCM_ANGLE45); glcm.getGLCMFeatures(vec, features); double energy_45 = features.energy
#define GLCM_DIS 3 //灰度共生矩阵的统计距离 #define GLCM_CLASS 16 //计算灰度共生矩阵的图像灰度值等级化 typedef enum GLCM_ANGLE { GLCM_ANGLE_HORIZATION, GLCM_ANGLE_VERTICAL, GLCM_ANGLE_DIGONAL_45, GLCM_ANGLE_DIGONAL_135 }GLCM_ANGLE k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]+ (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表其实就是所有像素可能的组合,比如,GLCM(1,1)就是I中像素值为1和1的组合,GLCM(4,5)就是I中像素4和像素5的组合,GLCM(i,j)的值呢就是I中像素为i,像素为j的有有多少和相邻的成对点 在a=1,b=0时:GLCM(1,1)=1;其实就是I中有几个1和1相邻(1个)(按上面的规则)GLCM(1,2)=2,几个1和2相邻(2个)。ok!
GLCM(1,2)值为2,是因为有两对灰度为1和2的像素水平相邻。(MatLab说明文档) ? GLCM表其实就是所有像素可能的组合,比如,GLCM(1,1)就是I中像素值为1和1的组合,GLCM(4,5)就是I中像素4和像素5的组合,GLCM(i,j)的值呢就是I中像素为i,像素为j的有有多少和相邻的成对点 在a=1,b=0时:GLCM(1,1)=1;其实就是I中有几个1和1相邻(1个)(按上面的规则)GLCM(1,2)=2,几个1和2相邻(2个)。ok! _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) print(glcm_0) asm,con,eng,idm=feature_computer(glcm_0) return
以20个像素值为横坐标,20个像素值为纵坐标,中间的值表示对应的频率,就得到了这个CT图像的GLCM可视化图。 如此这般,得到的GLCM矩阵描述的就是一组像素对儿在原始CT图像中,在固定偏移(del_x,del_y)中的共现概率分布。 The end of this 栗子. 2.2 简易的2D-image-GLCM代码实现 GLCM2 = graycomatrix(CTimage, 'Offset',[4,4], 'NumLevels ',20,'GrayLimits',[]); 2.3 2D-image向3D-Image拓展 对于一幅3D的图像,它的GLCM矩阵计算方法与2D图像类似,得到的GLCM矩阵依旧是一个二维的哦,因为GLCM 的横纵坐标是像素值,和原始图像的维度无关,即使是个4D图像,它的GLCM矩阵也同样是二维的。
): import numpy import SimpleITK as sitk import six from radiomics import firstorder, getTestCase, glcm features # glcmFeatures = glcm.RadiomicsGLCM(image, mask, **settings) glcmFeatures.enableAllFeatures () print('Will calculate the following GLCM features: ') for f in glcmFeatures.enabledFeatures.keys( __doc__) print('Calculating GLCM features...') results = glcmFeatures.execute() print('done') print In case of a flat region, each GLCM matrix has shape (1, 1), resulting in just 1 eigenvalue.
参考网址: 《纹理特征提取》 《【纹理特征】LBP 》 《灰度共生矩阵(GLCM)理解》 《灰度共生矩阵的理解》 《图像的纹理特征之灰度共生矩阵 》 参考论文: 《基于灰度共生矩阵提取纹理特征图像的研究 灰度共生矩阵(GLCM) 1. 此时满足矩阵值(1, 2)统计条件的值,共有8个,所以该窗口对应的GLCM统计矩阵的(1, 2)位置元素的值即为8。若统计矩阵值(3, 0),则如下图所示: ? 此时满足矩阵值(3, 0)统计条件的值,共有7个,所以该窗口对应的GLCM统计矩阵的(1, 2)位置元素的值即为7。又由于此例设定的灰度级只有4级,所以灰度共生矩阵GLCM是一个4×4的矩阵。 GitHub:https://github.com/upcAutoLang/GLCM-OpenCV
核心原理与关键函数 特征分类:颜色特征(RGB/HSV 通道)、边缘特征(基于灰度突变)、角点特征(局部灰度变化剧烈的点)、SIFT 特征(尺度不变特征)、纹理特征(基于灰度共生矩阵 GLCM); 关键函数 (五)纹理特征提取(基于灰度共生矩阵 GLCM) 实验任务 读取彩色图像→转换为灰度图→选择多个 ROI 区域→计算不同方向(0°、45°、90°、135°)的 GLCM→提取对比度、相关性 (roi3); title(sprintf('ROI3 - 右下角区域\n(%d x %d)', size(roi3,2), size(roi3,1)), 'FontSize', 10); % 定义GLCM 纹理特征分析 ===\n', roi_names{roi_idx}); for dir_idx = 1:size(offsets, 1) % 计算灰度共生矩阵 glcm 应用场景拓展 图像检索:结合颜色特征 + 纹理特征,实现相似图像查找; 目标识别:SIFT 特征 + 角点特征,实现复杂场景下的目标匹配; 纹理分类:GLCM 纹理特征,实现布料、木材等材质分类; 边缘检测
灰度共生矩阵 (GLCM) GLCM提供了关于图像像素之间如何相互关联的信息,这种关系帮助我们根据从GLCM中提取的多个特征对纹理进行分类。矩阵给出了具有相似强度的像素的位置信息。 GLCM是根据位移矢量中提到的距离和角度计算的。对于一个像素x,我们可以计算8个不同方向的GLCM值,如图7所示。 为了进一步了解这些特征是如何从GLCM中提取的,请查看这篇论文:http://www.ijsrp.org/research-paper-0513/ijsrp-p1750.pdf,其中详细讨论了GLCM。 这些技术包括两个以上的特征作为输入,如GLCM矩阵、LBP矩阵、小波和分形维数,以及原始输入图像。 然而,在这种关系中也有一些例外——例如,当原始输入与GLCM结合时,在特定情况下,精度会下降一小部分(图19)。
灰度共生矩阵(GLCM,Gray-Level Co-occurrence Matrix) 概念: 灰度共生矩阵是涉及像素距离和角度的矩阵函数,它通过计算图像中一定距离和一定方向的两点灰度之间的相关性,来反映图像在 含义: 以(1,1)点为例,GLCM(1,1)值为1说明左侧原图只有一对灰度为1的像素水平相邻。GLCM(1,2)值为2,是因为原图有两对灰度为1和2的像素水平相邻。 矩阵 |1 2 1| |2 2 2| |1 2 2| 对应GLMC矩阵(最大是2,所以是2*2矩阵) GLCM矩阵: 1 2 1|0 2| 2|1 6| 0(1,1)相邻, 2(1,2)水平相邻
gray_image, (5, 5), 0) return blurred_image# 定义特征提取函数def extract_features(image): # 计算图像的灰度共生矩阵 glcm np.pi / 2, 3 * np.pi / 4]) # 提取纹理特征(如对比度、相关性、能量、熵等) contrast = cv2.features.texture.glmcmContrast(glcm ) correlation = cv2.features.texture.glmcmCorrelation(glcm) energy = cv2.features.texture.glmcmEnergy (glcm) entropy = cv2.features.texture.glmcmEntropy(glcm) # 提取边缘特征(如边缘数量、边缘长度等) edges = cv2.Canny
false); // // 纹理特征 var B8 = inStack_monthly.select('B8') .multiply(100) .toInt16(); var glcm = B8.glcmTexture({ size: 3 }); var contrast = glcm.select('B8_contrast'); var var_ = glcm.select ('B8_var'); var savg = glcm.select('B8_savg'); var dvar = glcm.select('B8_dvar'); inStack_monthly = B8.glcmTexture({ size: 3 }); var contrast = glcm.select('B8_contrast'); var var_ = glcm.select ('B8_var'); var savg = glcm.select('B8_savg'); var dvar = glcm.select('B8_dvar'); inStack_monthly
其中,灰度共生矩阵(GLCM)和灰度游程矩阵(GLRLM)是两种最常用的方法。 GLCM考虑两个像素之间的关系,并计算特定方向上所有可能的组合灰度值出现次数以及它们之间的距离。 虽然GLCM通常在八个方向上计算,但一种常见的方法是通过组合相反的方向将它们减少到四个,从而得到对称的GLCM。 在实践中,GLCM是针对多个方向和距离计算的,并且只保留那些针对所解决问题呈现最佳特征的。然而,GLCM(灰度共生矩阵)是最主要和最深入研究的纹理分析方法之一,有着广泛的应用。 多项研究评估了不同肿瘤和癌症对纹理特征治疗的反应,例如,肺癌(一阶统计和GLCM特征)、肝转移(GLCM特征)和结直肠癌(一阶统计特征)。 在早期阶段,多发性硬化病变根据GLCM特征进行分类[300]。在随后的工作[64]中,从GLCM、GLRLM、梯度矩阵、自回归模型和小波变换中提取了额外的纹理特征。
GLCM Features(灰度共生矩阵特征) 灰度协方差矩阵 计算各像素在不同方面(同质性、均匀性)的整体平均相关程度。 灰度共生矩阵(GLCM)通过计算灰度像素i与j在特定空间关系中出现的频率。 使用Skimage实现GLCM ''' Source: https://scikitimage.org/docs/dev/auto_examples/features_detection/plot_glcm.html (patch, [5], [0], 256, symmetric=True, normed=True) xs.append(greycoprops(glcm, 'dissimilarity') [0, 0]) ys.append(greycoprops(glcm, 'correlation')[0, 0]) # create the figure fig = plt.figure Dissimilarity') ax.set_ylabel('GLCM Correlation') ax.legend() # display the image patchesfor i,
统计方法的典型代表,是一种被称为灰度共生矩阵(GLCM)的纹理分析方法。它是建立在估计图像的二阶组合条件概率密度基础上的一种方法。 尽管GLCM提取的纹理特征具有较好的鉴别能力,但是这个方法在计算上是昂贵的,尤其是对于像素级的纹理分类更具有局限性。并且,GLCM的计算较为耗时,好在不断有研究人员对其提出改进。 尤其是灰度共生矩阵(GLCM)方法是公认有效方法,有较强的适应性与鲁棒性; 缺点: 与人类视觉模型脱节,缺少全局信息的利用,难以在研究纹理尺度之间像素的遗传或依赖关系; 缺乏理论支撑; 计算复杂度较高
hold on;plot(corners.selectStrongest(50)); % 只显示前50个角点title('Harris角点检测结果');6.2.2 纹理特征提取纹理特征可以通过灰度共生矩阵(GLCM )来提取,以下是使用GLCM进行纹理特征提取的示例:% 计算灰度共生矩阵glcm = graycomatrix(grayImg, 'Offset', [0 1]); % 水平方向% 计算纹理特征stats = graycoprops(glcm);% 显示纹理特征disp('纹理特征:');disp(stats);7.
4)Glcm:Gray Level Cooccurence Matrix(24features)灰度共生矩阵 定义了一些关于相关性、能量、对比、逆差、方差、概率、熵、平方和等信息,具体不展开介绍了(主要是实在难以翻译 ),感兴趣可以去官网看公式(https://pyradiomics.readthedocs.io/en/latest/features.html#radiomics.glcm.RadiomicsGLCM
以下实现 GLCM 纹理描述子。 计算灰度共生矩阵(GLCM) # 距离d=1,方向0°、45°、90°、135° glcm = graycomatrix(roi, distances=[1], angles=[0, np.pi/4, 提取GLCM纹理特征 contrast = graycoprops(glcm, 'contrast') energy = graycoprops(glcm, 'energy') homogeneity = graycoprops(glcm, 'homogeneity') correlation = graycoprops(glcm, 'correlation') # 4. 基于 GLCM 纹理代码,对比两张不同纹理图像(如木纹、布纹)的对比度、能量、同质性特征,分析纹理差异。