Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现

2023-10-26

保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现
网络上Glcm的原理很多,但是实现的python代码我确实没找到,讲的也不是很清楚
此文介绍了如何在一张图片中得到Glcm灰度共生矩阵,并基于Glcm的特征提取.带每一步的讲解

Glcm(Gray-level co-occurrence matrix) 灰度共生矩阵
原理:就是通过计算灰度图像得到它的共生矩阵,然后透过计算这个共生矩阵得到矩阵的部分特征值,来分别代表图像的某些纹理特征(纹理的定义仍是难点)。
灰度共生矩阵能反映图像灰度关于方向、相邻间隔、变化幅度的综合信息,它是分析图像的局部模式和它们排列规则的基础.
明确几个概念:方向,偏移量和灰度共生矩阵的阶数.
定义:灰度共生矩阵是图像中相距为D的两个灰度像素同时出现的联合概率分布.
意义:共生矩阵方法用条件概率来反映纹理,是相邻像素的灰度相关性的表现.
在这里插入图片描述
步骤:

1.opencv 读取图片 调用库cv2
2.调用skimage 的feature文件中的greycomatrix, greycoprops函数
3.将图片划分为 8个等级的灰度共生矩阵
4.依据灰度共生矩阵获得图片的特征量

import numpy as np
from skimage.feature import greycomatrix, greycoprops
import cv2
import  os
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=16) #导入本地汉字字库,pyplot显示中文

1.测试greycomatrix函数 256阶 化为 8个等级

gray = np.random.randint(0,255,(10,10))
gray,gray.shape
'''将图片的256阶化为 8个等级'''
gray_8 = (gray/32).astype(np.int32)
gray,gray_8
(array([[ 46, 221, 101, 155,  36,  46, 192, 102, 140, 197],
        [213,  47, 202, 246, 120, 204, 201, 131, 202,   1],
        [117,  52, 230, 225,  23, 249, 215, 154, 216, 225],
        [ 19, 218,  26,  92,  77, 209, 165, 206, 195,  17],
        [ 93, 116,  12,  82, 130, 225, 195, 172, 249,  39],
        [ 20,  41, 204, 144,  37, 186,  25,  47,  54, 100],
        [245, 238, 100,  91, 143, 243, 229, 180,  71, 190],
        [175,   0,  62, 218, 173, 154,  80,  51, 233,  28],
        [ 98, 115, 254,  52, 165, 250, 147, 237,  47, 246],
        [126, 156, 246,  39, 140, 119,  25, 242,   1, 198]]),
 array([[1, 6, 3, 4, 1, 1, 6, 3, 4, 6],
        [6, 1, 6, 7, 3, 6, 6, 4, 6, 0],
        [3, 1, 7, 7, 0, 7, 6, 4, 6, 7],
        [0, 6, 0, 2, 2, 6, 5, 6, 6, 0],
        [2, 3, 0, 2, 4, 7, 6, 5, 7, 1],
        [0, 1, 6, 4, 1, 5, 0, 1, 1, 3],
        [7, 7, 3, 2, 4, 7, 7, 5, 2, 5],
        [5, 0, 1, 6, 5, 4, 2, 1, 7, 0],
        [3, 3, 7, 1, 5, 7, 4, 7, 1, 7],
        [3, 4, 7, 1, 4, 3, 0, 7, 0, 6]]))

函数详解:包含主要4个参数 图片,距离(需要为列表),角度(列表),灰度等级

greycomatrix(image, distances, angles, levels=None, symmetric=False,
normed=False)
symmetric :
如果为真,则输出矩阵P[:, :, d, theta]是对称的。这一点是通过忽略数值对的顺序来实现的.
normed:
如果是 “真”,则对每个矩阵P[:, :, d, theta]进行规范化处理,方法是将其除以
除以给定偏移量的累计共现总数。
偏移量。所得矩阵的元素之和为1。
默认为假.
传参要求
:greycomatrix(image, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4],
… levels=4
levels:级别数应该大于图像中的最大灰度值.

返回值:
P : 4-D ndarray
The grey-level co-occurrence histogram. The value
P[i,j,d,theta] is the number of times that grey-level j
occurs at a distance d and at an angle theta from
grey-level i. If normed is False, the output is of
type uint32, otherwise it is float64. The dimensions are:
levels x levels x number of distances x number of angles.

如下,调用灰度共生矩阵,传入参数,获得一个8灰阶的 8x8灰度共生矩阵
距离[1] 角度[0]

Glcm = greycomatrix(gray_8,[1],[0],levels=8)
Glcm_1 = Glcm.squeeze()
Glcm_1.shape,Glcm_1
((8, 8),
 array([[0, 3, 2, 0, 0, 0, 2, 2],
        [0, 2, 0, 1, 1, 2, 5, 3],
        [0, 1, 1, 1, 2, 1, 1, 0],
        [2, 1, 1, 1, 3, 0, 1, 1],
        [0, 2, 1, 1, 0, 0, 3, 4],
        [2, 0, 1, 0, 1, 0, 1, 2],
        [3, 1, 0, 2, 3, 3, 2, 2],
        [3, 4, 0, 2, 1, 1, 2, 3]], dtype=uint32))

{‘contrast’, ‘dissimilarity’,
‘homogeneity’, ‘energy’, ‘correlation’, ‘ASM’}
也就是一个Glcm 矩阵会 得到一个值

temp = greycoprops(Glcm,'ASM')
temp.shape,temp
((1, 1), array([[0.02691358]]))
def cut_img_step(img,step):  # 每个块大小为20x20
    '''传入Gray 图片与 step'''
    new_img = [] #240x240
    for i in np.arange(0, img.shape[0] + 1, step):
        for j in np.arange(0, img.shape[1] + 1, step):
            if i + step <= img.shape[0] and j + step <= img.shape[1]:
                new_img.append(img[i:i + step, j:j + step])
    new_img = np.array(new_img, dtype=np.int32)

    return new_img

好了,正式开始获取一张图片的Glcm 纹理

pwd = os.getcwd()
pwd
'D:\\_py项目文件夹\\ML-opencv-sklearn\\machine-book\\特征算子学习'
img = cv2.imread(r"../figures/guangzhou tower.jpg",cv2.IMREAD_GRAYSCALE)

'''将原图片的256阶化为 64个等级'''
level = 64
scale_data = 256/level


img_64= (img / scale_data).astype(np.int32)


plt.subplot(211)
plt.imshow(img,cmap='gray')
plt.title("256阶 675x1200",fontproperties=font)
plt.axis("off")
plt.subplot(212)
plt.imshow(img_64,cmap='gray')
plt.title("64阶 675x1200",fontproperties = font)
plt.axis("off")
plt.show()

在这里插入图片描述

如上图所示,我们使用了一张广州塔的图片,图片
Height, width
(675,1200)
这里要注意:
Float images are not supported by greycomatrix. Convert the image to an unsigned integer type.
opencv 读取图片会是float32这里需要将img_64 转为uint8类型

'''获取整张图片的Glcm纹理 4个方向 0-》3/4 pi,64阶'''
img_glcm64 = greycomatrix(img_64, [1], [0, np.pi / 4, np.pi / 2, 3 * np.pi / 4], levels=level)
'''将四个灰度共生矩阵对应相加后取
平均数得到影像的综合灰度共生矩阵'''
mean = []

for g_level1 in img_glcm64:
    for g_level2 in g_level1:
        for i in g_level2:
            mean.append(np.mean(i))

mean = np.array(mean)
'''Glcm_new 中保存了原图的Glcm4个方向的平均值'''
Glcm_new = mean.reshape(( level, level,1,1))# 后两个参数为步长数,方向数,计算特征需要


plt.subplot(211)
plt.imshow(img_64,cmap='gray')
plt.title("64阶 675x1200",fontproperties=font)
plt.axis("off")
plt.subplot(212)
plt.imshow(Glcm_new.reshape(level,level),cmap='gray')
plt.title("64阶Glcm 64x64",fontproperties = font)
plt.axis("off")
plt.show()


在这里插入图片描述

对角附近的元素有较大的值,说明图像的像素具有相似的像素值,
如果偏离对角线的元素会有比较大的值,说明像素灰度在局部有较大变化.

如上图,由于glcm 是一个统计量,如果我们使用pyplot 来显示图片,那么这个图片的信息实际是蕴含了一个三维的信息
[x轴,y轴,z轴],z轴是一个亮度值,x,y告诉我们位置信息
故而我们可以由这个统计的glcm分析得知,数据主要在主对角线上,也就说明
距离为1,原图4个方向上 有灰度对(x,x)的像素占绝大多少

依据Glcm提取这张图片的特征信息:
{‘contrast’, ‘dissimilarity’, ‘homogeneity’, ‘energy’, ‘correlation’, ‘ASM’}

'''注意greycoprops的传参要求  glcm 需要为[i,j,d,theta] '''
features = []
for prop in {'contrast', 'dissimilarity', 'homogeneity', 'energy', 'correlation', 'ASM'}:
    features.append(greycoprops(Glcm_new, prop))#
features
[array([[0.0107847]]),
 array([[1.20763164]]),
 array([[0.10384942]]),
 array([[11.31592761]]),
 array([[0.7139315]]),
 array([[0.96871746]])]

此时我们提取了这张图片,基于glcm 的特征
提取特征后,可以使用svm支持向量机来进行分类或者其他工作
如果说觉得一张图片只是取6个特征值有点少,那咱们也可以通过其他操作来增加特征的维度
1.通过分割图片.获取特征
2.通过特征融合增加其他特征,例如灰度值

以下分享一些自己造的一些轮子

def get_glcm_sixFeature(IMG_gray):  # 传入灰度图像
    input = IMG_gray  # 读取图像,灰度模式
    # 得到共生矩阵,参数:图像矩阵,距离,方向,灰度级别,是否对称,是否标准化
    glcm = greycomatrix(input,
                        [1,2],
                        [0, np.pi / 4, np.pi / 2, np.pi * 3 / 4],
                        levels=256, symmetric=True,
                        normed=True)  # 100x100 -> 3x4

    # 得到共生矩阵统计值,官方文档
    # http://tonysyu.github.io/scikit-image/api/skimage.feature.html#skimage.feature.greycoprops
    feature = []
    feature_descrip = {'contrast', 'dissimilarity',
                 'homogeneity', 'energy', 'correlation', 'ASM'}

    for prop in {'contrast', 'correlation',
                 'ASM','homogeneity'  }:
        temp = greycoprops(glcm, prop)
        feature.append(temp)

    return np.array(feature), glcm


def get_gray_feature(Imgs,step= 25):
    '''格式要求 (x灰度图像二维,100,100)'''
    print(f"Imgs shape is {Imgs.shape}")  #
    Imgs_number = Imgs.shape[0]
    Gray_feature_num = int((Imgs.shape[1] /step)**2)
    Avg_gray = []
    for img in Imgs:
        cut = cut_img_step(img,step)
        for patch in cut:  # 每张图4个patch
            Avg_gray.append(np.mean(patch))

    Avg_gray = np.array(Avg_gray)
    Avg_gray = Avg_gray.reshape(Imgs_number, Gray_feature_num)
    print(f'Avg_gray shape :{Avg_gray.shape}')

    return Avg_gray

其他文章
Sober算子边缘检测与Harris角点检测1
HOG特征+SVM 进行行人检测,带源码,异常处理
线性回归预测波士顿房价

引用
灰度共生矩阵c语言实现
灰度共生矩阵 - 百度百科
原始文档

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

Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现 的相关文章

  • Python - 套接字错误,地址正在使用

    我目前正在尝试在 Xubuntu 12 10 x64 上设置 SiriServer 这不是重点 当我运行服务器时 python 返回错误 socket error Errno 98 Address already in use 默认情况下
  • 提交搜索表单后无法使用 Flask 应用程序从 url 检索变量

    我想在用户提交搜索表单后呈现一个新视图 我的制作方式与处理其他视图的方式相同 但不幸的是这次没有发生任何事情 我无法从应用程序路由中检索内容 所以这个问题不是重复的this https stackoverflow com questions
  • 如何在 Pygame 中制作边框

    我试图让游戏的某个区域周围有边框 并使用一种尺寸来不断更改我的代码 以便它适用于一种尺寸 这是代码 screen xpos ypos height width border width color def draw borders s x
  • 如何让我的精灵向鼠标位置发射一个对象?

    对于一个学校项目 我需要通过实现一种向鼠标位置射击 Kunais Shurikens 的方式来完成下面的 pygame 程序 以便能够击中敌人精灵 import pygame import math import random from p
  • 用顶点之间的渐变填充 matplotlib 多边形

    我正在使用 matplotlib 的 Poly3DCollection 绘制多边形 三角形 的集合 三角形位于具有与其关联的颜色的顶点之间 我目前正在用通过平均三个顶点的颜色确定的纯色填充每个三角形 绘制三角形以形成 3D 表面网格 I w
  • 将ast节点转换为python对象

    给定一个ast可以自行计算的节点 但字面意义不够ast literal eval例如列表理解 src i 2 for i in range 10 a ast parse src Now a body 0 is an ast Expr and
  • 如何模拟嵌套函数?

    我想模拟特定函数中的一些嵌套函数 tools py def cpu count def get cpu quota return int load sys fs cgroup cpu cpu cfs quota us def get cpu
  • 实现一个java UDF并从pyspark调用它

    我需要创建一个在 pyspark python 中使用的 UDF 它使用 java 对象进行内部计算 如果它是一个简单的 python 我会做类似的事情 def f x return 7 fudf pyspark sql functions
  • Python 中的类位于不同的文件中吗?

    与 Java 或 php 非常相似 我习惯将类与文件分开 Python 中也是同样的情况吗 另外 我应该如何命名该文件 像classname py一样小写还是像ClassName py一样 如果我想从此类创建一个对象 我是否需要做一些特殊的
  • 使用 QtDesigner 的 pyQt 信号/槽

    我正在尝试编写一个与 QGraphicsView 交互的程序 我想在 QGraphicsView 中发生事件时收集鼠标和键盘事件 例如 如果用户单击 QGraphicsView 小部件 我将获得鼠标位置 类似的东西 我可以很容易地对其进行硬
  • 读取Excel文件时的Pandas数据框和字符编码

    我正在阅读一个包含多个数值和分类数据的 Excel 文件 name string 列包含外语字符 当我尝试查看 name string 列的内容时 我得到了我想要的结果 但外来字符 在 Excel 电子表格中正确显示 以错误的编码显示 这是
  • 如何禁用Excel自动识别数字和文本

    我使用 Python 生成了 CSV 文件 但是当我在Excel中打开它时 如果可以转换 Excel会自动将字符串识别为数字 e g 33E105变成33 10 105 这实际上是一个ID 而不是一个数字 如何在打开 CSV 文件时在 Ex
  • 如何加载 caffe 模型并转换为 numpy 数组?

    我有一个 caffemodel 文件 其中包含 ethereon 的 caffe tensorflow 转换实用程序不支持的层 我想生成我的咖啡模型的 numpy 表示 我的问题是 如何将 caffemodel 文件 我还有 prototx
  • 将数据导入 Django 的好方法

    我想定期将数据导入 Django 项目 我需要告诉我的数据提供者我想要以什么格式接收数据 我应该以 Json XML CSV 格式请求吗 在 Django 中通常如何处理这个问题 Django 有一个用于导入数据的完整框架 称为 Fixtu
  • 如何使用python将下载的音频文件扩展名重命名为mp3

    目前 我正在尝试根据艺术家姓名和歌曲标题将 YouTube 音乐视频下载为音频文件 下载所有视频后 我尝试将所有音频文件从 webm 或 mp4 扩展名重命名为 mp3 但似乎我在将文件名和扩展名更改为 mp3 时遇到了一些错误 我的代码基
  • 如何在 Python 中将列表变量传递给 subprocess.call 命令

    我有一个清单 apps apps append wq35a5huqlja45jsyukrpmwuiayovrmh apps append q7mimvgduueernwvw4y22t5huemykntw apps append pmudbp
  • 类型错误:“State”和“State”实例之间不支持“<” PYTHON 3

    我正在尝试利用队列类中的 PriorityQueue 但是 我在将自定义对象放入 PQ 时遇到问题 我已经实施了 cmp 函数如下 def cmp self other return self priority gt other prior
  • pytube 在 Android 中传输视频所需的时间太长

    我在用pytube在 Android 中流式传输视频 借助chaquopy 视频文件 py from pytube import YouTube def video link yt YouTube f https www youtube c
  • 使用scrapy到json文件只得到一行输出

    好吧 我对一般编程很陌生 并且具体使用 Scrapy 来实现此目的 我编写了一个爬虫来从 pinterest com 上的 pin 获取数据 问题是我以前从我正在抓取的页面上的所有引脚获取数据 但现在我只获取第一个引脚的数据 我认为问题出在
  • 连接字符串:两个字符串列表的“乘法”[重复]

    这个问题在这里已经有答案了 对于字符串列表 将乘法运算定义为连接 l1 aa bb cc l2 11 22 l3 l1 op l2 预期输出 l3 aa11 aa22 bb11 bb22 cc11 cc22 我们可以简单地使用 for l

随机推荐

  • mysql集群 配置Keepalived+mm

    集团公司已经在oracle方向有成熟的几十套环境 但是为了节约成本 要尝试下mysql下面先用两台linux x86 Red Hat Enterprise Linux Server release 5 4 Tikanga 和linux6 3
  • O-RAN专题系列-37:管理面-WG4.MP.V07-规范解读-第3章-启动安装流程:NETCONF会话的建立、维护、关闭

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122498392 目录 第3章 Sta
  • 计算机硬件基础——第一章:计算机系统概述

    目录 计算机发展历史 第一代 电子管计算机时代 1946 1957 其主要特点是采用电子管作为基本器件 第二代 晶体管计算机时代 1958 1964 这时期计算机的主要器件逐步由电子管改为晶体管 第三代 集成电路计算机时代 1965 197
  • 旧视频调整为4k视频提高分辨率Topaz Video Enhance AI

    Topaz Video Enhance AI是Mac上的提升视频分辨率的工具 也是拍摄出色画面 并将其变得完美方法 借助软件Topaz Video Enhance AI 可以将您的素材从标清转换为高清 并不会发生模糊 且会得到质量的提升 非
  • Java并发编程系列 - 互斥锁:解决原子性问题

    Java并发编程系列 互斥锁 解决原子性问题 原子的意思代表着 不可分 那么如果我们要保证原子性就必须满足 同一时刻只有一个线程执行 称之为互斥 如果我们能够保证对 共享变量的修改是互斥的 那么 无论是单核 CPU 还是多核 CPU 就都能
  • Elasticsearch框架基础概念

    Elasticsearch ES 是一个基于Lucene构建开源分布式搜索引擎并提供Restful接口 Es是一个分布式文档数据库 JSON数据格式存储 类似MongoDB JSON中的每个字段数据都可作为搜索条件 并且能够扩展至数以百计的
  • Mysql查询数据库表中前几条记录

    Mysql查询数据库表中前几条记录问题 我想好多朋友也会碰到 下面我简单的说下我遇到的情况 且解决方法 希望对好多朋友有许多帮助 下面是我数据库test中表student的数据 其中第二条记录被我删除了 在查询分析器中输入select fr
  • Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程

    基于pytorch的深度学习花朵种类识别项目完整教程 内涵完整文件和代码 相关链接 超详细 CNN卷积神经网络教程 零基础到实战 大白话pytorch基本知识点及语法 项目实战 文章目录 基于pytorch的深度学习花朵种类识别项目完整教程
  • Java集合 —— Map集合

    目录 1 Map接口和Collection接口的不同 2 Map集合的特点 3 Map集合的功能 4 HashMap原理 谈谈你对HashMap的理解 HashMap的数据插入原理是怎样的 5 HashTable特点 6 LinkedHas
  • Unity游戏开发 怪物巡逻AI

    今天实现的内容是怪物AI 看了一些网上的AI 不是特别符合我的需求 于是就自己研究了一种AI 大致和魔兽类的RPG游戏效果差不多 AI效果如下 1 将怪物分为如下几个状态 待机状态 该状态内有3种行为 原地呼吸 原地观察 和游走 可通过权重
  • 汇编语言(王爽第三版)实验九

    实验九 题目与个人思路 编程 在屏幕中间分别显示绿色 绿底红色 白底蓝色的字符串 welcome to masm 在80 25彩色字符模式下 显示器可以显示25行 每行80个字符 根据题意大致效果如下图所示 11行的起始地址计算10 80
  • C语言典型例题二——杨辉三角

    C语言典型例题二 杨辉三角 杨辉三角 C语言中的位运算有哪些操作符 杨辉三角 1 杨辉三角最本质的特征是 它的两条斜边都是由数字1组成的 而其余的数则是等于它肩上的两个数之和 这就是我们用C语言写杨辉三角的关键之一 杨辉三角是一种数学工具
  • Android Looper原理源码分析

    概要 在很久以前的时候转载了一小篇文章 Android Message Queue Message Looper Handler 白话介绍了一下Android Message Queue Looper Handler这几个概念之间的关系 其
  • windows下 mysql忘记root的密码怎么办

    如果mysql忘记密码无法登入 可以通过绕开输入密码登入的方式进行修改 步骤如下 1 右击 此电脑 点击 管理 打开 计算机管理 点击 服务与应用程序 点击 服务 2 找到mysql 先右击停用 再次右击mysql的打开属性对话框 3 在属
  • 942、增减字符串匹配——贪心+vector初始化方法

    文章目录 一 题目描述 二 题目分析 三 代码实现 四 总结 1 回顾一下 vector texttt vector vector 容器的几种初始化操作 一 题目描述 942 增减字符串匹配 由范围 0 n 内所有整数组成的 n
  • Go中 go-sql-driver 的使用

    go sql driver 是 Go 语言中一个常用的 MySQL 数据库驱动程序 支持 MySQL5 5 MySQL5 6 和 MySQL5 7 本文将介绍如何使用 go sql driver 包连接 MySQL 数据库 安装 在命令行中
  • linux计划任务5个*分表代表什么,linux 設置定時任務crontab

    前言 做自動化測試寫的腳本需要設置定制任務 在指定的時間去執行 這就需要用到定時任務 之前用jenkins可以在里面設置定時任務 很好用 其實在linux上也可以用crontab做定時任務 cron 在LINUX中 周期執行的任務一般由cr
  • Python在工业自动化领域的应用详解

    当我们开始讨论在工业自动化应用中使用哪种编程语言时 通常我们会首先谈论IEC 61131 3标准中用于可编程逻辑控制器 PLC 的语言 比如经典的梯形图 LD 或结构化文本 ST 对于机器人等应用 我们经常看到低级编译语言 比如C语言 这几
  • python代码规范快捷键_VS Code写Python的一些小技巧

    原标题 VS Code写Python的一些小技巧 本文基于 VS Code 1 36 1 为什么要用 VS Code 用 PyCharm 不好吗 VS Code 是开源免费的 PyCharm 是收费的 VS Code 除了 Python 还
  • Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现

    保姆级别教程 获取图片的Glcm和基于Glcm的纹理特征 附讲解思路 python代码的实现 网络上Glcm的原理很多 但是实现的python代码我确实没找到 讲的也不是很清楚 此文介绍了如何在一张图片中得到Glcm灰度共生矩阵 并基于Gl