灰度共生矩阵的实现

灰度共生矩阵GLCM及其matlab实现 Prerequisites概念计算方式对于精度要求高且纹理细密的纹理分布,我们取像素间距为d=1d = 1,以下是方向的说明:我们来看,matlab内置工具箱中的灰度共生矩阵的生成函数graycomatrix(gray-level co-occurrence matrix)对方向的说明: 如上图所示,方向是在每一个像素点(pixel of interest)的邻域(当然,边界点除外)中获得的, 阅读详情

     灰度共生矩阵,Gray Level Co-occurrence Matrix,简写为GLCM

     由于纹理是由灰度分布在空间位置上反复出现而形成的,因而在图像空间中相隔某距离的两象素之间会存在一定的灰度关系,即图像中灰度的空间相关特性。灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述纹理的常用方法。

     取图像(N×N)中任意一点 (x,y)及偏离它的另一点 (x+a,y+b),设该点对的灰度值为 (g1,g2)。令点(x,y) 在整个画面上移动,则会得到各种 (g1,g2)值,设灰度值的级数为 k,则(g1,g2) 的组合共有 k 的平方种。对于整个画面,统计出每一种 (g1,g2)值出现的次数,然后排列成一个方阵,再用(g1,g2) 出现的总次数将它们归一化为出现的概率P(g1,g2) ,这样的方阵称为灰度共生矩阵。

     下图显示了如何求解灰度共生矩阵,以(1,1)点为例,GLCM(1,1)值为1说明只有一对灰度为1的像素水平相邻。GLCM(1,2)值为2,是因为有两对灰度为1和2的像素水平相邻。

 


         设f(x,y)为一幅数字图像,其大小为M×N,灰度级别为Ng,则满足一定空间关系的灰度共生矩阵为:


        其中#(x)表示集合x中的元素个数,显然P为Ng×Ng的矩阵,若(x1,y1)与(x2,y2)间距离为d,两者与坐标横轴的夹角为θ,则可以得到各种间距及角度的灰度共生矩阵(i,j,d,θ)。其中元素(i,j)的值表示一个灰度为i,另一个灰度为j的两个相距为d的像素对在角的方向上出现的次数。结合上面的图会更容易理解。

       在计算得到共生矩阵之后,往往不是直接应用计算的灰度共生矩阵,而是在此基础上计算纹理特征量,我们经常用对比度、能量、熵、相关性等特征量来表示纹理特征。

        (1) 对比度:又称为反差,度量矩阵的值是如何分布和图像中局部变化的多少,反应了图像的清晰度和纹理的沟纹深浅。纹理的沟纹越深,反差越大,效果清晰;反之,对比值小,则沟纹浅,效果模糊。 


        (2) 能量:是灰度共生矩阵各元素值的平方和,是对图像纹理的灰度变化稳定程度的度量,反应了图像灰度分布均匀程度和纹理粗细度。能量值大表明当前纹理是一种规则变化较为稳定的纹理。          


        (3) 熵:是图像包含信息量的随机性度量。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大;因此熵值表明了图像灰度分布的复杂程度,熵值越大,图像越复杂。             


        (4) 相关性:也称为同质性,用来度量图像的灰度级在行或列方向上的相似程度,因此值的大小反应了局部灰度相关性,值越大,相关性也越大。


下面是代码的实现

#define GLCM_DIS 2  //灰度共生矩阵的统计距离
#define GLCM_CLASS 8 //计算灰度共生矩阵的图像灰度值等级化
#define GLCM_ANGLE_HORIZATION    0   //水平
#define GLCM_ANGLE_VERTICAL      1	 //垂直
#define GLCM_ANGLE_DIGONAL_45    2   //45度对角
#define GLCM_ANGLE_DIGONAL_135   3   //135度对角
int calGLCM(CvMat* bWavelet,int angleDirection,double* featureVector)
{
	int i,j;
	int width,height;
	int min,max;
	if(NULL == bWavelet)
		return 1;
	width = bWavelet->width;
	height = bWavelet->height;

	int * glcm = new int[GLCM_CLASS * GLCM_CLASS];
	int * histImage = new int[width * height];

	if(NULL == glcm || NULL == histImage)
		return 2;

	//灰度等级化---分GLCM_CLASS个等级
	int relative_value = 0;
	for(i = 0;i < height;i++){
		for(j = 0;j < width;j++){
			histImage[i * width + j] = (int)(CV_MAT_ELEM(*bWavelet,float,i,j) * GLCM_CLASS / 256);
			//printf("%d ",histImage[i * width + j]);
		}
	}

	//初始化共生矩阵
	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]++;
				}
			}
		}
	}
	//135度对角方向
	else if(angleDirection == GLCM_ANGLE_DIGONAL_135)
	{
		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]++;
				}
			}
		}
	}
	//45度对角方向
	else if(angleDirection == GLCM_ANGLE_DIGONAL_45)
	{
		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;
}

Reference:

http://blog.youkuaiyun.com/weiyuweizhi/article/details/5724050

http://blog.youkuaiyun.com/cxf7394373/article/details/6988229



 
基于灰度共生矩阵的图形纹理检测及路面状况的SVM分类实现 基于灰度共生矩阵的图形纹理检测及路面状况的SVM分类实现 项目源码: 文章目录基于灰度共生矩阵的图形纹理检测及路面状况的SVM分类实现灰度共生矩阵的特征参数实现过程分类结果设计总结 图像的特征提取是图像的识别和分类、基于内容的图像检索、图像数据挖掘等研究内容的基础性工作,其中图像的纹理特征对描述图像内容具有重要意义,纹理特征提取已成为图像领域研究的一个重要方法。 本项目以道路状况分类为背景,基于S... 阅读详情

相关推荐

【灰度共生矩阵(GLCM)原理及代码实现】

文章主旨详细介绍灰度共生矩阵(Gray-Level Co-occurrence Matrix, GLCM)的生成原理、核心特征量及其在图像纹理分析中的应用,并提供了可运行的Python代码实现。该网页是一篇理论结合实践的优秀技术文章。它不仅清晰地解释了GLCM这一经典纹理分析工具背后的数学原理,还提供了完整、可复现的代码,非常适合计算机视觉或图像处理领域的学习者和开发者入门并实践灰度共生矩阵。读者可以通过运行代码来直观理解GLCM如何工作,并提取图像的纹理特征。

blotemj.blog.youkuaiyun.com 177

使用灰度共生矩阵实现指纹分割

灰度共生矩阵,Gray Level Co-occurrence Matrix,简写为GLCM      由于纹理是由灰度分布在空间位置上反复出现而形成的,因而在图像空间中相隔某距离的两象素之间会存在一定的灰度关系,即图像中灰度的空间相关特性。灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述纹理的常用方法。      取图像(N×N)中任意一点 (x,y)及偏离它的另一点 (x+a,

IT修道者的专栏 5706

MATLAB中实现灰度共生矩阵特征值提取的详细教程

在数字图像处理和分析领域,图像的纹理特征是一个重要的研究对象,因为它能描述图像中像素灰度的空间分布规律。灰度共生矩阵(Grey Level Co-occurrence Matrix,GLCM)是一种常用且有效的纹理特征提取方法,它通过分析图像中像素灰度值之间的关系来提取纹理特征。纹理作为图像的一个基本特征,指的是图像中像素空间分布的某种规律性,它能够反映图像中目标表面的质感和质地。在图像处理和计算机视觉领域,纹理特征对于图像分析具有至关重要的作用,尤其是在图像分类、目标检测、场景理解等方面。

weixin_28787801的博客 1128

灰度共生矩阵的原理及实现(特征提取)-OpenCV

最近在研究机器学习相关内容,后面会尽量花时间整理成一个系列的博客,然后朋友让我帮他实现一种基于SVR支持向量回归的图像质量评价方法,然而在文章的开头竟然发现 灰度共生矩阵这个陌生的家伙,于是便有此文。 主要参考博客1:http://blog.youkuaiyun.com/jialeheyeshu/article/details/51337225 主要参考博客2:http://blog.csdn....

qingyun_wudaoletu的博客 7万+

灰度共生矩阵实现及四个主要特征提取实现函数

实现了在MATLAB上灰度共生矩阵的生成,以及四个主要特征向量的提取。

【AutoDL】使用云服务器跑深度学习代码

1.算力市场 租用服务器,选择自己心仪的服务器2.镜像可以选择一些基础的镜像,社区镜像里是git上有的环境。3.上传文件在文件存储中,选择上传的区,在右边点击上传,选择自己的文件上传到云服务器中。

weixin_45768644的博客 3701

灰度共生矩阵的原理及代码实现(python)

灰度共生矩阵的原理及代码实现(python) 1原理: 灰度共生矩阵(Gray Level Co-occurrence Matrix,GLCM)统计了灰度图中像素间的灰度值分布规律以区分不同的纹理。灰度共生矩阵中每个元素的值可以定义为(x, y)点与(x + dx, y + dy)点的值对为(i, j)的概率。统计整幅图像中每一种灰度值组合出现的概率矩阵 P 即为灰度共生矩阵。 灰度级量化 在实际应用中,一幅灰度影像的灰度级一般为256级,在计算由灰度共生矩阵推导出的纹理特征时,要求影像的灰...

Viraha_的博客 6555

【AI Agent 实战】OpenClaw 全面解析 + 全平台一键部署教程(本地 AI 智能体)

本文收录于 AI 智能体 & 自动化实战系列,手把手带你从零部署本地可控的 AI 执行助手关键词:OpenClaw、AI Agent、本地 AI 部署、自动化助手、Docker 部署

爱人爱己,风生水起 7802

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

因为最近要在OpenCV上试试各种图像分割算法的效果,其中灰度共生算法没有办法直接调用库函数,看了很多文章,其中有一篇博文讲的很清楚。 原文地址 现在按照自己的理解再复盘一遍算法过程,详细推导一下,有一些是上面那个博文搬过来的,本文只是学习笔记,以便日后查询使用。 // 在计算灰度共生矩阵前需要确定一些参数: 灰度共生矩阵灰度级,与灰度共生矩阵的阶数相同,即当灰度图像灰度级为N时,灰度共生矩阵为......

Jen_Hsueh的博客 2万+

[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向破解

这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。上一篇文章分享了IDA Pro反汇编工具的基础用法,并简单讲解一个EXE逆向工程解密实战方法;本篇文章将讲解动态分析OllyDbg工具的基础用法,主要是结合两个Crakeme案例逆向破解。希望对初学者有帮助,大神请飘过,谢谢各位看官!

杨秀璋的专栏 1万+

基于深度学习的三维重建算法——详解与实现

随着深度学习技术的迅猛发展,基于深度学习的三维重建算法在最近几年取得了显著的进展。而基于深度学习的三维重建算法通过利用深度神经网络,能够从大规模数据中学习到更准确、鲁棒的三维结构表示。本文综述了基于深度学习的三维重建算法,并给出了相应的源代码。随着深度学习技术的不断发展,我们相信基于深度学习的三维重建算法将会在未来得到更广泛的应用。实验结果表明,基于深度学习的三维重建算法在准确性和鲁棒性方面取得了显著的提升。以上是关于基于深度学习的三维重建算法的详细介绍与实现,希望对您有所帮助。

CyberGenius的博客 1227

灰度共生矩阵的matlab实现

今天在做一个灰度共生矩阵的程序的时候,看了几篇文章,得到了以下代码,可以实现matlab的灰度共生矩阵的提取: clc clear close all %灰度共生矩阵 SI = imread('test file.jpg'); I = [ 1 1 5 6 8 8; 2 3 5 7 0 2; 0 2 3 5 6 7 ]; [glcm,SI]=graycomatrix(I); glcm=graycomatrix(I); stat=graycoprops(glcm,'al

qq_30533835的博客 1406

针对小缺陷目标:在YOLOv11中引入小目标检测层

摘要: 针对YOLOv11在工业检测中漏检微小目标(如焊点气泡)的问题,研究发现深层特征下采样导致小目标信息丢失。通过在YOLOv11中增加P2检测层(4倍下采样)并融合浅层高分辨率特征,可显著提升小目标召回率。关键优化包括:调整模型结构、谨慎设计数据增强策略(减少MixUp、增加小目标粘贴)、重新分配损失权重(提升P2层权重)、优化推理速度(动态分辨率、通道裁剪)。同时强调数据质量的重要性,建议根据具体场景特性(目标尺寸、分布)定制方案,而非盲目调整模型。

as1225120794的博客 366

灰度共生矩阵的MatLab实现

上周五在复现一篇论文("Visual-Salience-Based Tone Mapping for High Dynamic Range Images")中的算法时涉足到了基于灰度共生矩阵的显著性度量,便顺手给实现了以下。我们将共生关系定义在w*w的窗口内,窗口内的不同两个像素p、q为共生关系,其灰度、即为共生灰度。论文算法在计算灰度共生矩阵前会先将灰度值量化为K个等级。当共生关系的考察窗口半径为r时,对于每个像素,我们只需要考察它右下方(包含本行和本列)的(r+1)*(r+1)-1个像素。因为站在当前像

u014230360的博客 6700

k8s中pod使用详解

k8s中Pod使用

congge 1万+

【电动汽车再生制动控制技术(万字长文,图文并茂)】

电动汽车再生制动的基本原理是:通过具有可逆作用的电动机/发电机来实现电动汽车动能和电能的转化。在汽车减速或制动时,可逆电机以发电机形式工作,汽车行驶的动能带动发电机将汽车动能转化为电能并储存在储能器(蓄电池或超级电容器)中;在汽车起动或加速时,可逆电机以电动机形式工作,将储存在储能器中的电能转化为机械能给汽车。这对于改善汽车的能量利用效率,延长电动汽车的行驶距离是至关重要的。

优快云-新能源汽车研发测试专业博主 1575

灰度共生矩阵代码实现

2概念 2灰度共生矩阵生成编辑 灰度直方图是对图像上单个象素具有某个灰度进行统计的结果,而灰度共生矩阵是对图像上保持某距离的两象素分别具有某灰度的状况进行统计得到的。 取图像(N×N)中任意一点 (x,y)及偏离它的另一点 (x+a,y+b),设该点对的灰度值为 (g1,g2)。令点(x,y) 在整个画面上移动,则会得到各种 (g1,g2)值,设灰度值的级

积沙成塔 6959

华为OD机试真题新系统-空间占用计算(Py/Java/C/C++/Js/Go)

华为OD机试新系统机试真题 【空间占用计算】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【空间占用计算】。

qq_45776114的博客 3433

灰度共生矩阵原理+Matlab中实现

共生矩阵用两个位置的象素的联合概率密度来定义,它不仅反映亮度的分布特性,也反映具有同样亮度或接近亮度的象素之间的位置分布特性,是有关图象亮度变化的二阶统计特征。它是定义一组纹理特征的基础。        由于纹理是由灰度分布在空间位置上反复出现而形成的,因而在图像空间中相隔某距离的两象素之间会存在一定的灰度关系,即图像中灰度的空间相关特性。灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述

abcpzh200的专栏 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

matlab自带函数实现灰度共生矩阵,求取特征值

原 matlab自带函数实现灰度共生矩阵,求取特征值 2018年04月05日 18:56:04 yukunjake 阅读数:794 ...

weixin_43702842的博客 1540

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

用matlab实现基于灰度共生矩阵的图片识别

代码主要实现了用灰度共生矩阵的特征值判断一系列图像中与某一图像最相似的5张图 clc;clear; str='F:\xmf\download\RS_Dataset/'; files=dir(strcat(str,'*.tif')); tzjzdl=zeros(1,8); y=zeros(1,1); for i=1:length(files) imagename=files(i).name; wjdz=[str,imagename]; imagedata=imread(wjdz);

qq_52984350的博客 1501

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

灰度共生矩阵(GLCM) 及matlab代码实现

这几天学习灰度共生矩阵,现记录如下: 讲灰度共生矩阵比较好的一份百度文库文档:http://wenku.baidu.com/view/84a1c051f01dc281e53af07c.html 以下内容转自:http://blog.sina.com.cn/s/blog_4a18533301010pl6.html   共生矩阵用两个位置的象素的联合概率密度来定义,它不仅反映亮度的分布特性

bookwormno1的专栏 1万+

【瑕疵检测】基于灰度共生矩阵实现痕迹检测matlab源码GUI

【瑕疵检测】基于灰度共生矩阵实现痕迹检测matlab源码GUI

k8291121的博客 971

python实现灰度共生矩阵

import math import itertools import numpy as np import cv2 def calculate_glcm(patch, ranges, dires, nb_bins, normalized=False, symmetric=False, SUM=False): """计算灰度共生矩阵 Args: patch ([ndarray]): 输入的图像,可分成小块 ranges ([list]]): 像素相邻间.

墨溟淇淼 2297

VS实现获取图像灰度共生矩阵

之前用MATLAB写的灰度共生矩阵,忽生想法,将其转为VS来实现。 首先极其简单说一下什么是灰度共生矩阵,我个人的理解是,就是像素间的一种对应关系,详细的讲解网上很多,我就不多说了。 这里的算法为了方便理解,没有处理时,最左边一列没有处理。 环境:WIN10+VS2015+OpenCV3.1.0 首先是最经典的lena图片 下面就直接贴代码 VS#include<opencv2/open

Joemt 1172
上一篇: 经典的机器学习方面的开源库
下一篇: 开源论坛框架调研总结
IT修道者
IT修道者 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄17年 326粉丝 95原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值