灰度共生矩阵的实现条件_灰度共生矩阵14个特征

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

     灰度共生矩阵,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的像素水平相邻。

 

灰度共生矩阵的实现条件_灰度共生矩阵14个特征

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

灰度共生矩阵的实现条件_灰度共生矩阵14个特征

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

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

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

灰度共生矩阵的实现条件_灰度共生矩阵14个特征

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

灰度共生矩阵的实现条件_灰度共生矩阵14个特征

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

灰度共生矩阵的实现条件_灰度共生矩阵14个特征

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

灰度共生矩阵的实现条件_灰度共生矩阵14个特征

下面是代码的实现

#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;}

Jetbrains全家桶1年46,售后保障稳定

Reference:

http://blog.csdn.net/weiyuweizhi/article/details/5724050

http://blog.csdn.net/cxf7394373/article/details/6988229

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234859.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • blob类型字段[通俗易懂]

    blob类型字段[通俗易懂]1、在mysql中,bolb是一个二进制大型对象,是一个储存大量数据的容器,例如图片,音频。2、插入blob类型数据比如使用preparedStatement,而不能使用Statment,因为blob类型数据不能使用字符串拼接。有关preparedStatement的使用请参考https://blog.csdn.net/weixin_46457946/article/details/1197812273、mysql的四种blob类型类型大小TinyBlob255byte.

    2025年7月12日
    3
  • mask rcnn实现教程「建议收藏」

    mask rcnn实现教程「建议收藏」一,首先去github上下载mask-rcnn源码,这里提供一个百度网盘地址链接:https://pan.baidu.com/s/1htJYyNy密码:0r2b含可运行DEMO更新链接:https://pan.baidu.com/s/1HBPtIPz0xpZsCprl7rc6hw密码:bvm5二,下载对应的mask_rcnn_coco.h5模型,这里给出百度网盘下载地址链接:h……

    2022年10月4日
    4
  • Django(66)admin后台管理注册用户「建议收藏」

    Django(66)admin后台管理注册用户「建议收藏」前言我们使用django创建用户可以使用注册接口的方式,也可以使用django自带的后台管理系统,这里就介绍使用后台管理系统创建用户admin后台管理系统在使用之前我们可以使用第三方的插件,来美

    2022年7月30日
    10
  • 汇编指令之移位指令[通俗易懂]

    汇编指令之移位指令[通俗易懂]   移位指令包括了算术移位指令、逻辑移位指令、循环移位指令。    格式为:xxxoper1,CL/1       ;移位次数只能是1或者存放在CL里面。一、算术移位指令1、算术左移指令SAL功能:左移一次,最低位补0,最高位送入CF标志位,如图:意义:左移n次,等于x2的n次幂。所以可用于有符号操作数做x2的n次幂运算。2、算术右移指令SAR功能:右移一次,最高位保持不变,最低位送入…

    2022年4月28日
    61
  • javascript中的字符串编码转换

    javascript中的字符串编码转换起因 自定义的一个 spider 在抓取来的数据中 有各式各样的数据存储编码 有些编码是 uxxxx uxxxx 的方式 这就涉及到一个 unicode 到可见字符的转换 比如转换为 gb2312 这样才能方便我们离开浏览器后也能阅读 原文链接 http ddbiz com p 194 在网上找了很多次方面的编码转换对照表 不过几乎没有一个完整 所以自己整理了一份 希望对大家有帮助 它

    2025年7月3日
    3
  • python 元类编程_python进阶路线图

    python 元类编程_python进阶路线图前言通常我们创建类都是使用class类名,但是小伙伴们有没有想过,类是由谁来创建的呢,python中常说的万物皆对象,对象是由类创建的,那类本身也可以看做是对象,类可以由元类type创建type

    2022年7月28日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号