纹理——灰度共生矩阵公式及代码
灰度共生矩阵(Grey-Level Co-occurence Matrix,GLCM)被定义为从灰度为i的像素点出发,离开某个固定位置(相隔距离为d,方位为)的点上灰度值为的概率,即,所有估计的值可以表示成一个矩阵的形式,以此被称为灰度共生矩阵。
• 在图像中任意取一点(x, y)以及偏离它的另一点(x+a, y+b),形成一个点对,设该点对的 灰度值为(i, j),即点
(x, y)的灰度为i , 点(x+a, y+b)的灰度为j。
• 固定a 与b,令点(x, y)在整幅图像上移动,会得到各种(i, j)值。设灰度值的级数为L,则i 与j 的组合共有L2种。
• 在整幅图像中,统计出每一种(i, j)值出现的次数,再将它们归一化为出现的概率Pij ,则称方阵[Pij ]L× L 为灰度联合概率矩阵,也称为灰度共生矩阵。
• 灰度联合概率矩阵实际上就是两像素点的联合直方图距离差分值(a, b)取不同的数值组合,可以得到沿一定方向如 (0o,45o,90o,135o) 相隔一定距离d 的像元之间灰度联合概率矩阵。
• a 和b 的取值要根据纹理周期分布的特征来选择,对于较细的纹理,选取(1,0),(0,1),(1,1),(-1,1)等小的差分值。
• 当a 与b 取值较小时,对应于变化较慢的纹理图像(粗纹理),其灰度联合概率矩阵对角线上的数值较大,倾向于作对角线分布;若纹理的变化越快(细纹理),则对角线上的数值越小,而对角线两侧上的元素值增大,倾向于均匀分布。
统计量:Haralick曾提出14种统计量:即:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。(由于灰度共生矩阵的数据量较大,一般不直接作为区分纹理的特征,而是基于它构建的一些统计量作为纹理分类特征。)
C 语言代码块(原文链接:https://blog.csdn.net/guanyuqiu/article/details/53117507)
#define GLCM_DIS 3 //灰度共生矩阵的统计距离
#define GLCM_CLASS 16 //计算灰度共生矩阵的图像灰度值等级化
typedef enum GLCM_ANGLE
{GLCM_ANGLE_HORIZATION,GLCM_ANGLE_VERTICAL,GLCM_ANGLE_DIGONAL_45,GLCM_ANGLE_DIGONAL_135
}GLCM_ANGLE;
int CalGlCM(unsigned char* pImage,GLCM_ANGLE angleDirection,double* featureVector)
{ int i,j; if(NULL == pImage) return 1; int * glcm = new int[GLCM_CLASS * GLCM_CLASS]; int * histImage = new int[width * height]; if(NULL == glcm || NULL == histImage) return 2; //灰度等级化---分GLCM_CLASS个等级 for(i = 0;i < height;i++){ for(j = 0;j < width; j++){ histImage[i * width + j] = (int)(data[width*i+j] * GLCM_CLASS/256); } } //初始化共生矩阵 for (i = 0;i < GLCM_CLASS;i++) for (j = 0;j < GLCM_CLASS;j++) glcm[i * GLCM_CLASS + j] = 0; //计算灰度共生矩阵 int w,k,l; //水平方向 if(angleDirection == GLCM_ANGLE_HORIZATION) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width) { k = histImage[i * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width) { k = histImage[i * width + j - GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } } } } //垂直方向 else if(angleDirection == GLCM_ANGLE_VERTICAL) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(i + GLCM_DIS >= 0 && i + GLCM_DIS < height) { k = histImage[(i + GLCM_DIS) * width + j]; glcm[l * GLCM_CLASS + k]++; } if(i - GLCM_DIS >= 0 && i - GLCM_DIS < height) { k = histImage[(i - GLCM_DIS) * width + j]; glcm[l * GLCM_CLASS + k]++; } } } } //对角方向 else if(angleDirection == GLCM_ANGLE_DIGONAL) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width && i + GLCM_DIS >= 0 && i + GLCM_DIS < height) { k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width && i - GLCM_DIS >= 0 && i - GLCM_DIS < height) { k = histImage[(i - GLCM_DIS) * width + j - GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } } } } //计算特征值 double entropy = 0,energy = 0,contrast = 0,homogenity = 0; for (i = 0;i < GLCM_CLASS;i++) { for (j = 0;j < GLCM_CLASS;j++) { //熵 if(glcm[i * GLCM_CLASS + j] > 0) entropy -= glcm[i * GLCM_CLASS + j] * log10(double(glcm[i * GLCM_CLASS + j])); //能量 energy += glcm[i * GLCM_CLASS + j] * glcm[i * GLCM_CLASS + j]; //对比度 contrast += (i - j) * (i - j) * glcm[i * GLCM_CLASS + j]; //一致性 homogenity += 1.0 / (1 + (i - j) * (i - j)) * glcm[i * GLCM_CLASS + j]; } } //返回特征值 i = 0; featureVector[i++] = entropy; featureVector[i++] = energy; featureVector[i++] = contrast; featureVector[i++] = homogenity; delete[] glcm; delete[] histImage; return 0;
}
python代码 来源:https://blog.csdn.net/kmsj0x00/article/details/79463376
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cv2
import math#定义最大灰度级数
gray_level = 16def maxGrayLevel(img):max_gray_level=0(height,width)=img.shapeprint height,widthfor y in range(height):for x in range(width):if img[y][x] > max_gray_level:max_gray_level = img[y][x]return max_gray_level+1def getGlcm(input,d_x,d_y):srcdata=input.copy()ret=[[0.0 for i in range(gray_level)] for j in range(gray_level)](height,width) = input.shapemax_gray_level=maxGrayLevel(input)#若灰度级数大于gray_level,则将图像的灰度级缩小至gray_level,减小灰度共生矩阵的大小if max_gray_level > gray_level:for j in range(height):for i in range(width):srcdata[j][i] = srcdata[j][i]*gray_level / max_gray_levelfor j in range(height-d_y):for i in range(width-d_x):rows = srcdata[j][i]cols = srcdata[j + d_y][i+d_x]ret[rows][cols]+=1.0for i in range(gray_level):for j in range(gray_level):ret[i][j]/=float(height*width)return retdef feature_computer(p):Con=0.0Eng=0.0Asm=0.0Idm=0.0for i in range(gray_level):for j in range(gray_level):Con+=(i-j)*(i-j)*p[i][j]Asm+=p[i][j]*p[i][j]Idm+=p[i][j]/(1+(i-j)*(i-j))if p[i][j]>0.0:Eng+=p[i][j]*math.log(p[i][j])return Asm,Con,-Eng,Idmdef test(image_name):img = cv2.imread(image_name)try:img_shape=img.shapeexcept:print 'imread error'returnimg=cv2.resize(img,(img_shape[1]/2,img_shape[0]/2),interpolation=cv2.INTER_CUBIC)img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)glcm_0=getGlcm(img_gray, 1,0)#glcm_1=getGlcm(src_gray, 0,1)#glcm_2=getGlcm(src_gray, 1,1)#glcm_3=getGlcm(src_gray, -1,1)asm,con,eng,idm=feature_computer(glcm_0)return [asm,con,eng,idm]if __name__=='__main__':result = test("test.bmp")print(result)
纹理——灰度共生矩阵公式及代码相关推荐
- Python计算图像纹理-灰度共生矩阵
基于Python探究灰度共生矩阵(GLCM)那点事儿 - 知乎一.什么是灰度共生矩阵? 灰度共生矩阵(Gray-level co-occurrence matrix:GLCM)和相关的纹理特征计算是图 ...
- python 灰度共生矩阵进行特征提取(代码)
接上一篇图像特征的学习笔记内容,进行了本地图片采用灰度共生矩阵进行特征提取: 本地图片作为输入: import numpy as np import matplotlib.pyplot as plt ...
- matlab灰色共生矩阵,matlab灰度共生矩阵
P. 通过实验证明了基于灰度共生矩阵的统计特征的有效性.洪继光于 1984 年在灰...0.0931894 图 2 实验用半调图 该结果各项数据经与使用 Matlab 处理的结果...... 针对图像 ...
- Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现
保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现 网络上Glcm的原理很多,但是实现的python代码我确实没找到,讲的也不是很清楚 此文介绍了如何在一张图 ...
- 灰度共生矩阵(附python代码)
理论内容引自https://blog.csdn.net/qq_37059483/article/details/78292869 最近在研究机器学习相关内容,后面会尽量花时间整理成一个系列的博客,然后 ...
- 图像纹理特征(灰度共生矩阵等)解析和编程调用
图像纹理特征 本文主要介绍医学影像领域常用到的基于图像灰度值变化所衍生出的各项纹理特征,理论部分主要参考了文献1,同时介绍了相关函数调用方式. 灰度共生矩阵 灰度共生矩阵2,Gray-Level ...
- 灰度共生矩阵纹理特征提取_纹理特征提取
纹理通常被定义为图像的某种局部特征,或是对局部区域中像素之间关系的一种度量. 纹理的标志有三要素:①某种局部的序列性,在该序列更大的区域内不断重复:②序列是由基本部分非随机排列组成的:③各部分大致都是 ...
- 灰度共生矩阵(GLCM)附Python代码
参考文献:Textural Features for Image Classification1. 代码地址:https://github.com/Code-0x00/pyCV 简介 灰度共生矩阵(G ...
- 灰度共生矩阵的原理及代码实现(python)
灰度共生矩阵的原理及代码实现(python) 1原理: 灰度共生矩阵(Gray Level Co-occurrence Matrix,GLCM)统计了灰度图中像素间的灰度值分布规律以区分不同的纹理.灰 ...
- 灰度共生矩阵特征提取步骤_灰度共生矩阵纹理特征提取的Matlab实现
灰度共生矩阵纹理特征提取的 Matlab 实现 焦蓬蓬 ; 郭依正 ; 刘丽娟 ; 卫星 [期刊名称] <计算机技术与发展> [年 ( 卷 ), 期] 2012(000)011 [摘要] ...
最新文章
- [转]Windows与VC命名规则
- 视觉三维重建的关键技术及实现思路汇总
- Joda-Time中两个日期之间的天数
- Confluence 6 找到在创建 XML 备份的时候出现的错误
- python str输出到txt_Python 速学!不懂怎么入门python的小白看这篇就够了!
- ros构建机器人运动学模型_古月私房课 | ROS机械臂开发中的主角MoveIt!
- 【Yaml】Yaml学习笔记
- 作者:谢华美(1976-),男,中国人民银行征信中心数据部副总经理
- 关于vector的两个问题(reserve方法修整过剩空间)
- 删除Windows 7系统保留分区100MB
- Routh-Hurwitz Criterion 劳斯稳定判据
- mac安装虚拟机VMware fusion12 和ubantu系统
- 2019年10月19日星期六
- 有效缓解失眠的好物,睡前尝试这些助眠好物改善失眠
- 头的各个部位示意图_上臂肌群图示:肱二头肌、肱三头肌、肱肌部位图解说明...
- 便签记事内容怎么放到手机桌面上?
- Authentication and Authorization授权与验证
- 3、TextBox 控件
- 心电图ECG常用滤波器之陷波器
- 带你解析微信公众号灵魂有香气的女子的创始人李筱懿
热门文章
- 切图直接导出html,Dreamweaver切图到生成网页的方法
- Linux/Windows/C++网络开源库项目集合
- vc6.0处理wps文字
- 一位计算机牛人的心得,谈计算机和数学
- 计算机考试一级b软件未来教育,2019.9全国计算机一级MS Office考试每日一练
- HTTP权威指南—基础部分
- 力软框架java_力软敏捷框架 jfGrid 使用例子之一
- 数据库(SQL)面试题,基础知识(超全面)
- 安装VMware时,出现 安装程序无法继续 Microsoft Runtime DLL 安装程序未能完成安装 您无权输入许可证密钥,请使用系统管理员账户重试 VMware15.5.x 安装问题处理
- html主题网站设计代码示例,网页设计参考:很不错的15个HTML网页表单设计实例