图像的纹理特性之灰度共生矩阵的graycomatrix函数及其matlab实现

本文主要是介绍图像的纹理特性之灰度共生矩阵的graycomatrix函数及其matlab实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图像的灰度共生矩阵(Gray-level co-occurrence matrix from an image)

灰度共生矩阵是像素距离和角度的矩阵函数,它通过计算图像中一定距离和一定方向的两点灰度之间的相关性,来反映图像在方向、间隔、变化幅度及快慢上的综合信息。
graycomatrix

matlab(r2013b)里如下解释和使用

语法
glcm = graycomatrix(I)
glcms = graycomatrix(I, param1, val1,param2, val2,...)
[glcm, SI] = graycomatrix(...)

描述
glcm = graycomatrix(I):创建图形I的灰度共生矩阵glcm。graycomatrix通过计算灰度值(灰度强度)i与水平相邻的灰度值为j的相邻频率,来得到GLCM。(也可以使用'Offsets'参数,指定像素的空间临接关系)。GLCM里的元素(i,j)代表代表灰度i与灰度j在图像中水平相邻的次数。
graycomatrix从图像的scaled version中得到GLCM。默认的,如果是一个二进制图像,graycomatrix将这个图像转换到两个灰度级(two grey-levels)。如果I是一个强度图像,graycomatrix将该图像转换到8个灰度级。使用NumLevels 参数可以指定graycomatrix转换后的灰度级别,使用'GrayLimits' 参数可以指定转化的方式。
下图显示了在4*5的图像中,graycomatrix如何计算GLCM里的一些值。


图1
glcms = graycomatrix(I,param1,val1,param2,val2,...)返回一个或多个灰度共生矩阵,具体取决于可选参数/值。 参数名称可以缩写,大小写也不重要。

参数
按字母表顺序列出如下参数
'GrayLimits' 描述: 一个二元素向量[low high],用于指定I中的值如何缩放到gray级别。 如果N是用于缩放的灰度级数(参见参数'NumLevels'),范围[low high]被划分为N个相等的宽度bins,并且bin中的值被映射到一个灰度级别。 小于等于low的灰度值的缩放为1.将大于等于high的灰度值缩放为“NumLevels”。如果“GrayLimits”设置为[],则将I中的灰度级最小和最大灰度值设置为low和high,[min{I(:)} max{I(:)}] 默认 如 double[0 1] int16 [-32768 32767],不写该参数时, 默认为[0,1]
理解:具体过程是这样的,是从图像I缩放到si,然后根据si来得到glcm(图1)。

matlab示例如下
i =
1.0000 1.5000 2.0000
2.5000 3.0000 3.5000
4.0000 4.5000 5.0000
>> [glcms,si] = graycomatrix(i,'graylimits',[1,4])
glcms =
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 2
si =
1 2 3
5 6 7
8 8 8
理解:由i 根据'graylimits',[1,4] 将i映射为灰度级别默认为1-8的si 小于等于1映射为1,大于等于4映射为8,1-4之间再划分六个等级带对应至2 3 4 5 6 7,
接着按默认水平邻接的方法,将像素值水平邻接的次数放至矩阵glcm中

'NumLevels' 描述:指定了在I中缩放灰度值时要使用的灰度级数的整数。例如,如果NumLevels为8(默认为8),则graycomatrix将I中的值缩放为1到8之间的整数。灰度级数决定了 灰度共生矩阵(glcm)的大小。
matlab示例如下
>> i=[-0.1 0.5;1 2]
i =
-0.1000 0.5000
1.0000 2.0000
>> [glcms,si] = graycomatrix(i,'numlevels',3)
glcms =
0 1 0
0 0 0
0 0 1
si =
1 2
3 3
理解:未写graylimits 默认为[0,1],所以大于等于1的为2,小于等于0为1,0-1为2,glcm为3*3矩阵

'Offset' 描述:p*2整数数组,指定感兴趣像素与其邻像素之间的距离。 数组中的每一行都是一个两元素向量[row_offset,col_offset],用于指定像素的关系或偏移量。 row_offset是感兴趣像素与其邻居之间的行数。 col_offset是感兴趣像素与其邻居之间的列数。由于偏移量通常表示为一个角度,下表列出了指定公共角度的偏移值,与定像素距离D(理解:[0,D]为0度:0代表行距为0,即同一行,d代表列相距为d,为正数在右边,所以为0度)。 默认为[0,1]

>> i=[-0.1 0.5 1;1 2 3]
i =
-0.1000 0.5000 1.0000
1.0000 2.0000 3.0000
>> [glcms,si] = graycomatrix(i,'numlevels',3,'offset',[0 2])
glcms =
0 0 1
0 0 0
0 0 1
si =
1 2 3
3 3 3
理解,offset',[0 2],所以,glcm坐标为【1,2】处没有值。【1.3】【3,3】处有值
'Symmetric' 描述:布尔值创建一个GLCM,其中不考虑像素对中的值的排序。 例如,当“symmetric”设置为true时,当计算值1与值2相邻的次数时,灰度矩阵将计算1,2和2,1两个配对。当“symmetric”为“false”时,灰度矩阵仅计数1,2 或2,1,取决于“offset”的值。 默认为false
[glcm, SI] = graycomatrix(...) 返回用于计算灰度生成矩阵glsm的缩放图像SI。 SI中的值介于1和NumLevel之间。
Class Support
I可以是数字或逻辑矩阵,但必须是二维,实数和非稀疏的。 SI是具有与I相同大小的double型矩阵。glcms是'NumLevels'*'NumLevels'*P的double型阵列,其中P是'offset'中的偏移数。
notes

灰度共生矩阵的另一个名称是灰度空间依赖矩阵(gray-level spatial dependence matrixgray-level spatial dependence matrix)。 此外,文献中常常使用cooccurrence,而没有连字符。
如果像素包含NaN,则灰度矩阵忽略该像素对儿。
graycomatrix替换正值Infs为NumLevels值,并取代负值Infs为值1。
如果相应的相邻像素落在图像边界之外,则灰度矩阵忽略边界像素。
当“Symmetric”设置为true时,创建的GLCM在其对角线上是对称的,并且相当于Haralick(1973)描述的GLCM。 GLCM通过以下语法生成,“Symmetric”设置为true
灰度矩阵(I,'offset',[0 1],'Symmetric',true)
相当于以下声明产生的两个GLCM的总和,其中“Symmetric”被设置为false。
graycomatrix(I,'offset',[0 1],'Symmetric',false)
graycomatrix(I,'offset',[0 -1],'Symmetric',false)Examples

例子
1、
I = imread('circuit.tif');
glcm = graycomatrix(I,'Offset',[2 0]);
2、
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',[])




这篇关于图像的纹理特性之灰度共生矩阵的graycomatrix函数及其matlab实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301188

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter