图像的纹理特性之灰度共生矩阵的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++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议