又叫做灰度共现矩阵

Prerequisites

概念

计算方式

对于精度要求高且纹理细密的纹理分布,我们取像素间距为d=1d=1,以下是方向的说明:

我们来看,matlab内置工具箱中的灰度共生矩阵的生成函数graycomatrix(gray-level co-occurrence matrix)对方向的说明:

如上图所示,方向是在每一个像素点(pixel of interest)的邻域(当然,边界点除外)中获得的,只不过这里的坐标系变为了:

  • δ=(0,±1)δ=(0,±1)为水平方向扫描,也即θ=0∘orθ=180∘θ=0∘orθ=180∘;
  • δ=(±1,0)δ=(±1,0)为垂直扫描(θ=90∘orθ=−90∘θ=90∘orθ=−90∘);
  • δ=(1,−1),δ=(−1,1)δ=(1,−1),δ=(−1,1)是−45∘−45∘或135∘135∘扫描;
  • δ=(1,1),δ=(−1,−1)δ=(1,1),δ=(−1,−1)是45∘45∘扫描。

一旦像素间距离dd以及像素间空间位置关系δδ确定,即可生成灰度共生矩阵。

GLCM所表示的是纹理图像的某些统计特性,所谓统计,通俗地讲就是累计某种情况出现的次数,用这一次数除以总的情况数,即可得其统计意义上的概率。

我们来统计灰度级2与2在-45度和135度方向上(也即δ=(1,−1)δ=(1,−1)或者δ=(−1,1)δ=(−1,1))出现的次数,如图所示,共出现九次,在两个方向上即是18次。

matlab

matlab相关工具箱函数

使用灰度共生矩阵(GLCM)描述和提取图像纹理特征,是一个强大且流行的工具,自然matlab工具箱会提供相应的函数——graycomatrix

给出一个图像矩阵,设置一些参数,得到其灰度共生矩阵,这就是函数的基本用法:

[glcm, SI] = graycomatrix(I, ...)
  • 1

主要的参数有二个,分别是

  1. NumLevels(灰度级数)

最终glcm的size是NumLevels*NumLevels

  1. Offset(方向[0, 1; -1, 1; -1, 0; -1, -1]):

[0, 1]中的1表示的偏移数(offset),当然也可以取2或者更多,如上文所说,对于精度要求高且图像纹理本身即很丰富的图像来说,为了更精细地刻画,我们取偏移量(offset)为1

我们将原始I转换为SI,对SI计算GLCM,SI中元素的值介于[1, NumLevels]之间。

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', [])
% 'Offset'的default值为`[0, 1]`
glcm =

     0     0     2     0     0     0     0     0     0
0 1 0 0 0 1 0 0 0
0 0 0 2 0 0 0 0 0
0 0 0 0 0 2 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 1 0
0 0 0 0 0 0 0 1 1
1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 SI = 2 2 6 7 9 9
3 4 6 8 1 3
1 3 4 6 7 8

demo

这里先写一个demo,稍微有点难懂的地方在于灰度共生矩阵的计算方式,然后是一些编程上的循环判断。其他方向的情况还未考虑(在第三和第四层循环的地方可能会略有不同),以及将其封装成一个函数的操作还是留待以后吧:

clear, clc
P = [ 0 1 2 0 1 2
1 2 0 1 2 0
2 0 1 2 0 1
0 1 2 0 1 2
1 2 0 1 2 0
2 0 1 2 0 1];
[r, c] = size(P);
P_u = unique(P); % 去重,得到所有的灰度级
n = length(P_u); % 不同灰度级的个数
G = zeros(n, n); % 初始化灰度共生矩阵为全0矩阵, %% 四层循环,最外层的两层循环用来为GLCM的各个位置赋值
% 内层的两层循环时遍历原始图像矩阵,累计符合某一对应关系的的情况出现的次数 for p = 1:n,
for q = 1:n, cnt = 0; % GLCM刻画的是灰度图像像素的统计特性,在matlab中通过次数的统计计算得到
for i = 1:r,
for j = 1:c,
if (j+1) <= c && ((P(i, j) == p && P(i, j+1) == q) || P(i, j) == q && P(i, j+1) == p),
cnt = cnt + 1;
end
end
end
G(p, q) = cnt;
end
end
G

References

[1] <图像特征提取——灰度共生矩阵(GLCM)>

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。


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

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

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

相关度(inverse different moment):

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

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

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

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

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

参考:

《数字图像处理与计算机视觉:visual C++与Matlab实现》章挣
————————————————
版权声明:本文为CSDN博主「light_lj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/light_lj/article/details/26098815

灰度共生矩阵(Gray-level Co-occurrence Matrix,GLCM),矩阵的特征量的更多相关文章

  1. 灰度共生矩阵GLCM分析

    纹理分析是对图像灰度(浓淡)空间分布模式的提取和分析.纹理分析在遥感图像.X射线照片.细胞图像判读和处理方面有广泛的应用.关于纹理,还没有一个统一的数学模型.它起源于表征纺织品表面性质的纹理概念,可以 ...

  2. 【图像算法】图像特征:GLCM灰度共生矩阵,纹理特征

    [图像算法]图像特征:GLCM SkySeraph Aug 27th 2011  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modifie ...

  3. 灰度共生矩阵(GLCM) 及matlab代码实现

    原地址:http://blog.csdn.net/bookwormno1/article/details/7962466 这几天学习灰度共生矩阵,现记录如下: 讲灰度共生矩阵比较好的一份百度文库文档: ...

  4. [CareerCup] 1.7 Set Matrix Zeroes 矩阵赋零

    1.7 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column are ...

  5. css3 matrix 2D矩阵和canvas transform 2D矩阵

    一看到“2D矩阵”这个高大上的名词,有的同学可能会有种畏惧感,“矩阵”,看起来好高深的样子,我还是看点简单的吧.其实本文就很简单,你只需要有一点点css3 transform的基础就好. 没有前戏,直 ...

  6. Leetcode 54:Spiral Matrix 螺旋矩阵

    54:Spiral Matrix 螺旋矩阵 Given a matrix of m x n elements (m rows, n columns), return all elements of t ...

  7. bzoj 4128: Matrix ——BSGS&&矩阵快速幂&&哈希

    题目 给定矩阵A, B和模数p,求最小的正整数x满足 A^x = B(mod p). 分析 与整数的离散对数类似,只不过普通乘法换乘了矩阵乘法. 由于矩阵的求逆麻烦,使用 $A^{km-t} = B( ...

  8. PAT (Advanced Level) 1105. Spiral Matrix (25)

    简单模拟. #include<cstdio> #include<cstring> #include<cmath> #include<map> #incl ...

  9. [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

随机推荐

  1. socket小程序写一个客户端,实现给服务端发送hello World字符串,将客户端发送的数据变成大写后返回

    写一个客户端,实现给服务端发送hello World字符串,将客户端发送的数据变成大写后返回 本机id是192.168.xx.xy 服务端 import socket soc = socket.soc ...

  2. AQS 抽象队列同步器(Abstract Queued Synchronizer) 知识点

    AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态. AQS使用一个int类型的成员变量state来表示同步状态,当state>0时表示已经获取了锁,当state = ...

  3. VMware下安装Ubuntu虚拟机

    ubuntu系统是以桌面应用为主的.当下最火的linux操作系统,具有实用的界面,并且完全免费. 在Ubuntu的 Linux 世界里,已经不再只是简陋的界面+命令行,而是一款华丽时尚且无比实用的操作 ...

  4. swiper使用总结-坑点汇总

    1.开发中遇到个坑,ScrollableTabView(选项卡)+swiper(轮播图)在安卓下,初始化的第一页不会渲染,需要在ScrollableTabView挂载完毕后再渲染swiper. 解决方 ...

  5. ReactiveX 学习笔记(29)使用 RxCpp(RxQt)+ Qt 进行 GUI 编程

    课题 程序界面由3个文本编辑框和1个文本标签组成. 要求文本标签实时显示3个文本编辑框所输入的数字之和. 文本编辑框输入的不是合法数字时,将其值视为0. 3个文本编辑框的初值分别为1,2,3. 下载 ...

  6. VS 编译总是出现错误: "LC.EXE 已退出,代码为-1"

    最近在开发CS的一个项目时,编译总是出现错误: "LC.EXE 已退出,代码为-1" 解决方法一:用记事本打开*.licx,里面写的全是第三方插件的指定DLL,删除错误信息,保存, ...

  7. unzip命令(转)

    unzip命令用于解压缩由zip命令压缩的“.zip”压缩包. 语法 unzip(选项)(参数) 选项 -c:将解压缩的结果显示到屏幕上,并对字符做适当的转换: -f:更新现有的文件: -l:显示压缩 ...

  8. B 题解————2019.10.16

    相信他说的话,但不要当真 [题目描述]有一个长度为 n 的自然数序列 a,要求将这个序列恰好分成至少 m 个连续子段. 每个子段的价值为该子段的所有数的按位异或.要使所有子段的价值按位与的结果最大,输 ...

  9. p1842 奶牛玩杂技 题解

    感觉其他dalao讲的不是很明白啊,我这样的蒟蒻看不懂啊. 在luogu这个dalao遍地的地方我蒟蒻看个题解也不明白,我为跟我同病相怜的蒟蒻写一篇吧 其实真是不太明白,大部分题解都是只说 体重大的在 ...

  10. CSS3中box-sizing属性的作用以及应用场景

    盒模型box-sizing: 取值 1.content-box 默认值,标准盒模型,设置宽度为内容宽度,实际宽度为左右边距加上左右边框加上左右填充再加上内容宽度 2.border-box 设置宽度等于 ...