图像处理 - GLCM灰度共生矩阵如何计算

2023-05-16

因为最近要在OpenCV上试试各种图像分割算法的效果,其中灰度共生算法没有办法直接调用库函数实现,看了很多文章,其中有一篇博文讲的很清楚。博主有提供原理和源码,大家可以直接看原博。

原文地址:纹理特征提取方法:LBP, 灰度共生矩阵

我现在按照自己的理解以代码逻辑再复盘一遍算法过程,详细推导一遍,有一些是上面那个博文搬过来的,本文只是学习笔记,以便日后查询使用。

// 在计算灰度共生矩阵前需要确定一些参数:

  1. 灰度共生矩阵灰度级,与灰度共生矩阵的阶数相同,即当灰度图像灰度级为N时,灰度共生矩阵为N × N的矩阵。一般一幅图的灰度级有256级,0-255,但由于计算量大,一般选取4、8、16作为灰度级;
  2. 滑动窗口尺寸,即每次计算特征值所选用的窗口矩阵大小,一般选取5x5或7x7;
  3. 方向选择:计算灰度共生矩阵的方向一般为0°,45°,90°,135°四个方向;求出四个方向矩阵的特征值后,可以通过计算四个特征值的平均值作为最终特征值共生矩阵;
  4. 步距d:一般选择d = 1,即中心像素直接与其相邻像素点做比较运算;
  5. 为了解释说明方便,用N=4个灰度级,7*7窗口矩阵作为示例。

// 具体步骤如下:

1. 将原图灰度量化

原图的灰度级为256时,当分成N个灰度级时,直接将像素点的灰度值除以(256/N)取整。比如,选择4灰度级,就将像素点灰度值除以64即可。图a灰度级为4的7*7窗口矩阵。
图a
2. 计算一个矩阵窗口中,按照某个方向统计的灰度共生矩阵

A. d=1,求0°方向矩阵A的共生矩阵
水平方向
则按照0°方向(即水平方向从左向右,从右向左两个方向),共有以下几种情况:
1/ 统计矩阵值(0, 1),则如下图所示:
在这里插入图片描述
此时满足矩阵值(0,1)统计条件的值,共有10个,所以该窗口对应的GLCM统计矩阵的(0, 1)和(1, 0)位置元素的值即为10。

2/ 统计矩阵值(1, 2),则如下图所示:
在这里插入图片描述
此时满足矩阵值(1,2)统计条件的值,共有11个,所以该窗口对应的GLCM统计矩阵的(1, 2)和(2, 1)位置元素的值即为11。

3/ 统计矩阵值(2, 3),则如下图所示:
在这里插入图片描述
此时满足矩阵值(2,3)统计条件的值,共有11个,所以该窗口对应的GLCM统计矩阵的(2, 3)和(3, 2)位置元素的值即为11。

4/ 统计矩阵值( 3,0),则如下图所示:

在这里插入图片描述
此时满足矩阵值(3,0)统计条件的值,共有10个,所以该窗口对应的GLCM统计矩阵的(3, 0)和(0, 3)位置元素的值即为10。

最后的GLCM 4 × 4统计矩阵结果如下:
在这里插入图片描述

B. d=1,求45°方向矩阵A的共生矩阵
在这里插入图片描述
则按照45°方向(即45°方向从右上向左下,从左下向右上两个方向),共需统计以下4种情况:统计矩阵值(0,0)(1, 1),(2,2)(3,3)。
具体分析如A同理,最后的GLCM 4 × 4统计矩阵结果如下:
在这里插入图片描述
C. d=1,求90°方向矩阵A的共生矩阵
在这里插入图片描述
计算方法类似上述。
在这里插入图片描述
D. d=1,求135°方向矩阵A的共生矩阵
在这里插入图片描述
计算方法类似上述。
在这里插入图片描述
3. 矩阵的归一化

将矩阵所有元素与矩阵中所有元素之和作除运算,得到概率矩阵。

用P表示灰度共生矩阵的归一化频率矩阵,其中i, j表示按照某方向同时出现于两个像素的某两个级别的灰度值,所以P(i, j)表示满足这种情况的两个像素出现的概率。 以上述情景B中的矩阵为例: 原矩阵为:
在这里插入图片描述
归一化后,矩阵形式变为:
在这里插入图片描述
4. 计算单窗口灰度共生矩阵特征值

我们一般采用四个最常用的特征来提取图像的纹理特征:能量、对比度、相关度、熵。
a. 能量(角二阶距)
在这里插入图片描述
能量是灰度共生矩阵各元素的平方和,又被称角二阶距。它是图像纹理灰度变化均一的度量,反映了图像灰度分布均匀程度和纹理粗细程度。

b. 对比度
在这里插入图片描述
对比度是灰度共生矩阵主对角线附近的惯性矩,它体现矩阵的值如何分布,反映了图像的清晰度和纹理沟纹的深浅。

c. 相关度
在这里插入图片描述
用来度量图像的灰度级在行或列方向上的相似程度,因此值得大小反应了局部灰度相关性,值越大,相关性也越大。

d. 熵
在这里插入图片描述
图像包含信息量的随机性度量。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大;因此熵值表明了图像灰度分布的复杂程度,熵值越大,图像越复杂。

5. 计算单窗口所有统计方向对应的特征值后平均化

6. 计算整幅图像,重复步骤2-5

一个滑动窗口计算结束后,该窗口就可以移动一个像素点,形成另一个小窗口图像,重复进行上一步的计算,生成新窗口图像的共生矩阵和纹理特征值; 以此类推,滑动窗口遍历完所有的图像像素点后,整个图像就形成了一个由纹理特征值构成的一个纹理特征值矩阵。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像处理 - GLCM灰度共生矩阵如何计算 的相关文章

  • k8s部署ingress-nginx的方法步骤

    1 ingress概述 我们知道service的表现形式为IP PORT xff0c 即工作在第四层传输层 xff08 TCP IP层 xff09 xff0c 那么对于不同的URL地址经常对应用不同的后端服务或者虚拟服务器 xff0c 这些
  • 计算机软技术,如何画好一张架构图?

    什么是架构图 xff1f 如何画好一张架构图 xff0c 要做好这件事情首先要回答的就是什么是架构图 我们日常工作中经常能看到各种各样的架构图 xff0c 而且经常会发现大家对架构图的理解各有侧重 深入追究到这个问题 xff0c 可能一下子
  • yum与apt

    linux系统分类 一般来说著名的linux系统基本上分两大类 xff1a 1 RedHat系列 xff1a Redhat Centos Fedora等 2 Debian系列 xff1a Debian Ubuntu等 RedHat 系列 1
  • netstat常用场景记录

    参数说明 netstat命令各个参数说明如下 xff1a a 显示所有连线中的端口 不加此参数默认不显示处于监听状态的端口 n 不进行DNS轮询 xff0c 显示IP 可以加速操作 r 显示路由表信息 t 显示TCP传输协议的端口连线状况
  • log4j动态加载配置文件

    应用场景与问题 当项目在运行时 xff0c 我们如果需要修改log4j 1 X或者log4j2的配置文件 xff0c 一般来说我们是不能直接将项目停止运行再来修改文件重新部署的 于是就有这样一个问题 xff1a 如何在不停止当前项目的运行的
  • vm options、program arguments、environment property

    系统变量 system property 是java应用程序自身指定的变量 xff0c 通常我们可以在启动应用的时候指定 xff0c 指定方式可以有以下两种 输入java jar help 回顾一下java启动jar文件的命令 java o
  • 解决IntelliJ IDEA各种中文乱码问题

    1 修改文件编码方式 打开IntelliJ IDEA gt File gt Setting gt Editor gt File Encodings xff0c 将Global Encoding Project Encoding Defaul
  • 解析IDEA中的Artifacts配置

    1 Artifact 2 Artifact名称 3 Artifact类型 4 输出路径 xff08 也就是Deployment root部署根目录 xff09 xff0c 项目运行后的输出根目录 5 输出根目录 xff0c 即4指定的地址
  • IDEA代码以及注释格式化,行宽设置,以及自动换行

    一 设置代码最大行宽 xff0c 以及自动换行 勾选wrap on typing xff0c 即在编码时 xff0c 超出最大行宽 xff0c 则自动换行 xff0c 或者采用下面这种方式 xff0c 在手动格式化的时候 xff0c 进行自
  • IDEA设置代码规范,代码格式化设置,以及ALIBABA编码规约

    阿里巴巴格式化模板文件下载地址 https github com alibaba p3c 第一个文件是 代码格式化时用的模板 第二个文件是 注释模板 一 eclipse 格式化设置 格式化模板导入 依次点击 xff1a Window gt
  • 数组的初始化 array initializer is not allowed here

    此处不允许使用数组初始值设定项 array initializer is not allowed here 数组的使用分声明和初始化两部分 xff0c 两者可同时进行 xff0c 也可分开进行 int array 声明 array 61 n
  • Maven打包所有依赖到一个可执行jar中,将外部依赖加入到classPath中

    首先说一下比较常用的两种打包方式 xff1a 前提 xff1a maven构建可执行jar包时 xff0c 如果项目依赖了pom中定义的dependency之外的外部jar包 xff0c maven jar plugin默认是不会把这 些额
  • postgresql数据库|数据库实操----表复制详解

    前言 xff1a 通常情况下 xff0c 我们对数据库的增删改查的时候 xff0c 为了确保数据的安全 xff0c 需要备份表 xff0c 那么 xff0c 一种方法是通过pg dump 这个工具做SQL转储操作 xff0c 此方法比较复杂
  • Centos7 配置防火墙 firewall

    一 firewall 1 从CentOS7开始 xff0c 默认使用firewall来配置防火墙 xff0c 没有安装iptables xff08 旧版默认安装 xff09 2 firewall的配置文件是以xml的格式 xff0c 存储在
  • Windows多媒体开发框架介绍

    Windows 多媒体开发框架介绍 欢迎来到 Windows 的多媒体开发世界2D 绘图 API1 GDI2 GDI 43 3 Direct2D 音频 API1 MME2 DirectSound3 Windows Core AudioCor
  • 【Ubuntu】在QT运行程序后无结果显示,只有终端运行的解决办法

    转自 http stackoverflow com questions 3255035 qt creator run in terminal https bugs launchpad net ubuntu 43 source qtcreat
  • 【蓝桥杯嵌入式】关于CT117E下载程序出问题解决方案(含keil mdk4和keil mdk5移植)

    废话 万事开头难 xff0c 然后中间难 xff0c 最后难 寒假刚开始 xff0c 我看到了蓝桥杯嵌入式 很快啊 xff01 报名 买板一气呵成 没想到这块CT117E板子它不讲武德 xff0c 来骗 xff0c 来偷袭我这个二十岁的小伙
  • c语言冒泡排序详解(分析每一步,附代码)

    冒泡排序 xff08 Bubble Sort xff09 xff0c 是一种计算机科学领域的较简单的排序算法 它重复地走访过要排序的元素列 xff0c 依次比较两个相邻的元素 xff0c 如果顺序 xff08 如从大到小 首字母从Z到A x
  • 解决maven update project 后项目jdk变成1.5

    一 问题描述 在Eclipse中新建了一个Maven工程 然后更改JDK版本为1 7 结果每次使用Maven gt Update project的时候JDK版本都恢复成1 5 二 原因分析 Maven官方文档有如下描述 xff1a 编译器插
  • C语言——整型和浮点型混合运算

    1 int和double混合运算 C语言int和double混合运算时 xff0c 会自动将int类型的数据转换为double类型的数据 xff0c 最后得到的结果也是double类型 如下例 xff1a double a 61 4 0 9

随机推荐

  • C语言——函数指针

    目录 1 函数指针概念 1 1 函数指针的声明 1 2 函数指针的定义 1 3 使用typedef定义函数指针的别名 1 4 将常数转换为函数指针 1 5 函数指针的调用 1 6 将函数指针作为函数的传入参数 2 简单的例子 1 函数指针概
  • C语言——多线程基础(pthread)

    目录 1 线程的定义以及线程的创建 1 1 线程和进程的概念 1 2 使用pthread create 函数创建进程 2 使用pthread join 等待线程结束 2 1 使用pthread join 等待线程结束 2 1 使用pthre
  • C++——双端队列(deque)

    1 双端队列 xff08 deque xff09 双端队列 xff08 deque xff09 是队列的一种变形 xff0c 一般队列只能在队尾添加元素 xff08 push xff09 xff0c 在队首删除元素 xff08 pop xf
  • Linux|集群初始化脚本--osiniit.sh简介

    前言 xff1a 不管是什么部署 xff0c 前期的准备工作通常都是比较繁琐的 xff0c 但同时这些工作又具有程式化的特征 xff0c 也就是说都是有一定的流程的 xff0c 固定的步骤的 OK xff0c shell脚本处理这样的程式问
  • C++——优先级队列(priority_queue)

    目录 1 优先级队列 xff08 priority queue xff09 1 1 基本概念 1 2 优先级队列的定义 1 3 通过重写仿函数来支持自定义数据类型 1 4 通过运算符重载来支持自定义比较函数 1 5 优先级队列的基本操作 2
  • 操作系统——进程状态

    进程从创建到执行 xff0c 再到执行完毕销毁的过程中 xff0c 经历了不同的进程状态 xff0c 进程状态部分取决于进程当前的活动 xff0c 可以将进程状态分为 xff08 1 xff09 三状态模型 xff1b xff08 2 xf
  • 操作系统——进程调度

    目录 1 基本概念 1 1 CPU I O执行周期 1 2 CPU调度程序 xff08 CPU scheduler xff09 1 3 进程状态模型 1 4 抢占调度 1 5 调度程序 xff08 dispatcher xff09 1 6
  • C++实现优先级队列模板类

    1 优先级队列 1 1 基本原理 仿照C 43 43 STL 中的优先级队列priority queue xff0c 主要实现以下功能 xff1a 向队列中添加元素后 xff0c 队列自动调整 xff0c 保证队列中优先级最高的元素在队列头
  • C++通过WMI获取计算机电池电压的程序以及我出现的问题解决

    C 43 43 通过WMI获取计算机电池电压的程序以及我出现的问题解决 ConsoleApplication1 cpp 定义控制台应用程序的入口点 include stdafx h include DXGI h include vector
  • 深度学习——批量归一化(笔记)

    主流的卷积网络基本都设计批量归一化这个层 1 为什么要批量归一化 xff1f 网络层很深 xff0c 数据在底层 xff0c 损失函数在最顶层 反向传播后 xff0c 顶层的梯度大 xff0c 所以顶层训练的较快 数据在底层 xff0c 底
  • Mininet连接ONOS的一些问题

    Mininet连接ONOS的一些问题 一 启动ONOS二 简单小问题1 Mininet创建最简拓扑后连接不上远程控制器2 Mininet创建最简拓扑后主机之间ping不通3 不启动fwd应用自己通过REST API下发流表发现两台主机间pi
  • 关于codeblocks找不到路径从而无法编译的解决方法

    下载完codeblocks后 xff0c 可能会出现像下面的情况 解决方法是 xff1a 点击codeblocks里的settings的Compiler xff08 1 xff09 可能是中间箭头蓝色的那里出错 xff0c 有些人可能会在安
  • 如何获取维普免费账号--在校外下载维普万方等全文

    如何获取维普免费账号 在校外下载维普万方等全文 如何获取维普免费账号 在校外下载维普万方等全文 1 马上就要工作了 xff0c 觉得学校里面图书馆资料很多 xff0c 并且很有用 xff0c 都可以在CNKI 万方维普等中文数据库 xff0
  • 京东网络开放之路——自研交换机探索与实践

    相比传统商业交换机 xff0c 白盒交换机具有更好的开放性和灵活性 xff0c 解决了运维管理方面的诸多痛点 xff0c 随着SONiC的不断完善和白盒交换机市场的成熟 xff0c 京东基于SONiC研发了自己的白盒交换机 xff0c 更加
  • Linux|sed命令花式批量修改文件

    前言 xff1a sed命令 xff0c 流式修改文本文件的强大工具 xff0c 比如 xff0c 最常用的关闭selinux时通常采用sed命令快速修改 OK xff0c 其实sed命令虽然强大 xff0c 但它修改文件的方式是非常多的
  • Python列表详解_List()

    Python列表 一 了解列表二 列表的创建三 访问列表中的值四 对列表进行更新五 删除列表元素 一 了解列表 什么是列表 xff1f 列表能干什么 xff1f 今天我们几分钟统统解决他 xff01 1 首先我们先来了解一下列表 列表是Py
  • Linux(Deepin、Ubuntu)安装Citrix receiver教程

    Deepin20 6安装Citrix receiver教程 安装的deepin20 6想要安装Citrix receiver xff0c 发现要么装不上 xff0c 要么装上了不能用 xff0c 找了好多资料 xff0c 最终找到可以使用的
  • 服务器(一):VNC view 无法打开终端问题

    1 VNC view 无法打开终端问题 参考链接 xff1a Ubuntu 的终端打不开 xff0c gnome terminal没反应 ubuntu 打开不了gnome terminal 显示错误提示exited status 8 Ubu
  • Hadoop 从零开始学习系列-wordCount

    学习基于hadoop2 5 2版本 WordCount做为hadoop的hello world程序 xff0c 今天花了半天时间 xff0c 终于跑出了结果 xff0c 以下记录过程 1 建立maven工程 xff0c 加载hadoop相关
  • 图像处理 - GLCM灰度共生矩阵如何计算

    因为最近要在OpenCV上试试各种图像分割算法的效果 xff0c 其中灰度共生算法没有办法直接调用库函数实现 xff0c 看了很多文章 xff0c 其中有一篇博文讲的很清楚 博主有提供原理和源码 xff0c 大家可以直接看原博 原文地址 x