灰度共生矩阵

灰度共生矩阵法,顾名思义,就是通过计算灰度图像得到它的共生矩阵,然后透过计算这个共生矩阵得到矩阵的部分特征值,来分别代表图像的某些纹理特征(纹理的定义仍是难点)。灰度共生矩阵能反映图像灰度关于方向、相邻间隔、变化幅度的综合信息,它是分析图像的局部模式和它们排列规则的基础。

对于灰度共生矩阵的理解,需要明确几个概念:方向,偏移量和灰度共生矩阵的阶数。

计算机数字分析的任务时研究关于景物纹理特征的定量分析和解释并获得有效的文理度量。灰度共生矩阵是一种对图像处理进行定量描述的方法。

定义:灰度共生矩阵是图像中相距为D的两个灰度像素同时出现的联合概率分布。

意义:共生矩阵方法用条件概率来反映文理,是相邻像素的灰度相关性的表现。

1.共生矩阵的构成

共生概率:P(p,q,d,0

共生矩阵:

P(p,q)=

     
     
     

灰度 0 1 2 3 共生矩阵是对称的,(0度看成水平方向,且通常先做灰度级的压缩,方向限定为四种,即0,45,90,135)

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

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

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

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

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

应用

由上面的叙述知道,可以根据各种间距和角度计算灰度共生矩阵,下面程序中给定了间距,根据传入的参数计算:

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

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

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

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

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

应用

由上面的叙述知道,可以根据各种间距和角度计算灰度共生矩阵,下面程序中给定了间距,根据传入的参数计算:

  1. #define GLCM_DIS 3  //灰度共生矩阵的统计距离
  2. #define GLCM_CLASS 16 //计算灰度共生矩阵的图像灰度值等级化
  3. #define GLCM_ANGLE_HORIZATION 0  //水平
  4. #define GLCM_ANGLE_VERTICAL   1  //垂直
  5. #define GLCM_ANGLE_DIGONAL    2  //对角
  6. int calGLCM(IplImage* bWavelet,int angleDirection,double* featureVector)
  7. {
  8. int i,j;
  9. int width,height;
  10. if(NULL == bWavelet)
  11. return 1;
  12. width = bWavelet->width;
  13. height = bWavelet->height;
  14. int * glcm = new int[GLCM_CLASS * GLCM_CLASS];
  15. int * histImage = new int[width * height];
  16. if(NULL == glcm || NULL == histImage)
  17. return 2;
  18. //灰度等级化---分GLCM_CLASS个等级
  19. uchar *data =(uchar*) bWavelet->imageData;
  20. for(i = 0;i < height;i++){
  21. for(j = 0;j < width;j++){
  22. histImage[i * width + j] = (int)(data[bWavelet->widthStep * i + j] * GLCM_CLASS / 256);
  23. }
  24. }
  25. //初始化共生矩阵
  26. for (i = 0;i < GLCM_CLASS;i++)
  27. for (j = 0;j < GLCM_CLASS;j++)
  28. glcm[i * GLCM_CLASS + j] = 0;
  29. //计算灰度共生矩阵
  30. int w,k,l;
  31. //水平方向
  32. if(angleDirection == GLCM_ANGLE_HORIZATION)
  33. {
  34. for (i = 0;i < height;i++)
  35. {
  36. for (j = 0;j < width;j++)
  37. {
  38. l = histImage[i * width + j];
  39. if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width)
  40. {
  41. k = histImage[i * width + j + GLCM_DIS];
  42. glcm[l * GLCM_CLASS + k]++;
  43. }
  44. if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width)
  45. {
  46. k = histImage[i * width + j - GLCM_DIS];
  47. glcm[l * GLCM_CLASS + k]++;
  48. }
  49. }
  50. }
  51. }
  52. //垂直方向
  53. else if(angleDirection == GLCM_ANGLE_VERTICAL)
  54. {
  55. for (i = 0;i < height;i++)
  56. {
  57. for (j = 0;j < width;j++)
  58. {
  59. l = histImage[i * width + j];
  60. if(i + GLCM_DIS >= 0 && i + GLCM_DIS < height)
  61. {
  62. k = histImage[(i + GLCM_DIS) * width + j];
  63. glcm[l * GLCM_CLASS + k]++;
  64. }
  65. if(i - GLCM_DIS >= 0 && i - GLCM_DIS < height)
  66. {
  67. k = histImage[(i - GLCM_DIS) * width + j];
  68. glcm[l * GLCM_CLASS + k]++;
  69. }
  70. }
  71. }
  72. }
  73. //对角方向
  74. else if(angleDirection == GLCM_ANGLE_DIGONAL)
  75. {
  76. for (i = 0;i < height;i++)
  77. {
  78. for (j = 0;j < width;j++)
  79. {
  80. l = histImage[i * width + j];
  81. if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width && i + GLCM_DIS >= 0 && i + GLCM_DIS < height)
  82. {
  83. k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS];
  84. glcm[l * GLCM_CLASS + k]++;
  85. }
  86. if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width && i - GLCM_DIS >= 0 && i - GLCM_DIS < height)
  87. {
  88. k = histImage[(i - GLCM_DIS) * width + j - GLCM_DIS];
  89. glcm[l * GLCM_CLASS + k]++;
  90. }
  91. }
  92. }
  93. }
  94. //计算特征值
  95. double entropy = 0,energy = 0,contrast = 0,homogenity = 0;
  96. for (i = 0;i < GLCM_CLASS;i++)
  97. {
  98. for (j = 0;j < GLCM_CLASS;j++)
  99. {
  100. //熵
  101. if(glcm[i * GLCM_CLASS + j] > 0)
  102. entropy -= glcm[i * GLCM_CLASS + j] * log10(double(glcm[i * GLCM_CLASS + j]));
  103. //能量
  104. energy += glcm[i * GLCM_CLASS + j] * glcm[i * GLCM_CLASS + j];
  105. //对比度
  106. contrast += (i - j) * (i - j) * glcm[i * GLCM_CLASS + j];
  107. //一致性
  108. homogenity += 1.0 / (1 + (i - j) * (i - j)) * glcm[i * GLCM_CLASS + j];
  109. }
  110. }
  111. //返回特征值
  112. i = 0;
  113. featureVector[i++] = entropy;
  114. featureVector[i++] = energy;
  115. featureVector[i++] = contrast;
  116. featureVector[i++] = homogenity;
  117. delete[] glcm;
  118. delete[] histImage;
  119. return 0;
  120. }

灰度共生矩阵(GLCM)理解相关推荐

  1. 灰度共生矩阵(GLCM)

    灰度共生矩阵(GLCM) 算法简介 灰度共生矩阵法(GLCM, Gray - level co - occurrence matrix),就是通过计算灰度图像得到它的共生矩阵,然后透过计算该共生矩阵得 ...

  2. matlab 灰度共生矩阵熵,图像的灰度共生矩阵GLCM(matlab 函数帮助).

    Gray-level co-occurrence matrix from an image 图像的灰度共生矩阵 灰度共生矩阵是像素距离和角度的矩阵函数,它穿越计算图像中定然距离和定然方向的两点灰度之间 ...

  3. 基于灰度共生矩阵(GLCM)的图像纹理分析与提取

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 灰度共生矩阵 灰度共生矩阵(Gray Level CO-Occur ...

  4. 灰度共生矩阵GLCM及其matlab实现

    Prerequisites 概念 计算方式 对于精度要求高且纹理细密的纹理分布,我们取像素间距为d=1d = 1,以下是方向的说明: 我们来看,matlab内置工具箱中的灰度共生矩阵的生成函数gray ...

  5. 计算灰度共生矩阵GLCM

    灰度共生矩阵 灰度共生矩阵定义为像素对的联合分布概率,是一个对称矩阵,它不仅反映图像灰度在相邻的方向.相邻间隔.变化幅度的综合信息,但也反映了相同的灰度级像素之间的位置分布特征,是计算纹理特征的基础. ...

  6. 二维特征分类的基础_纹理特征1:灰度共生矩阵(GLCM)

    GLCM复习备用: 纹理分析是对图像灰度(浓淡)空间分布模式的提取和分析.纹理分析在遥感图像.X射线照片.细胞图像判读和处理方面有广泛的应用.关于纹理,还没有一个统一的数学模型.它起源于表征纺织品表面 ...

  7. 纹理特征分析的灰度共生矩阵(GLCM)

    纹理分析是对图像灰度(浓淡)空间分布模式的提取和分析.纹理分析在遥感图像.X射线照片.细胞图像判读和处理方面有广泛的应用.关于纹理,还没有一个统一的数学模型.它起源于表征纺织品表面性质的纹理概念,可以 ...

  8. 【OpenCV 例程 300篇】231. 特征描述之灰度共生矩阵(GLCM)

    『youcans 的 OpenCV 例程200篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]231. 特征描述之灰度共生矩阵(GLCM) 4.2.4 灰度共生矩阵(GLCM) ...

  9. 关于灰度共生矩阵的一点知识(MATLAB)

    目录 一.基本理论 1.背景 2.概念 3.含义 4.例证 5.规律 二.特征量 1.对比度(contrast) 2.角二阶矩(Angular Second Moment, ASM) 3.熵(entr ...

最新文章

  1. 使用R构建随机森林回归模型(Random Forest Regressor)
  2. Netty之粘包问题解决
  3. 了解ReactOS调试
  4. java自定义异常返回_Java自定义异常
  5. opencv进阶学习笔记14:分水岭算法 实现图像分割
  6. SAP OData:How is note $expand being implemented
  7. java 验证码_java学习之web基础(6):使用Response的输出流在页面输出验证码
  8. java static调用吗_Java中的static的使用
  9. 大刚二开emlog模板超级帅-全版本兼容-修复各种bug
  10. It seems that scikit-learn has not been built correctly.
  11. 直线/折线/圆/三角形划分平面直线切割球问题大总结(最多能划分多少区域)
  12. git fatal: Authentication failed for ‘https://gitee.com
  13. ffmpeg m4a 转pcm_使用ffmpeg解码音频文件到PCM格式
  14. Web前端开发规范手册 1
  15. 织梦留言板模板 .php,织梦DEDECMS留言板功能制作及调用标签
  16. 2019腾讯广告算法大赛
  17. UE/蓝图 VR高级框架(AdvancedFrameworkVR4.1) 使用前的简单设置
  18. android网络工程师,网络工程师考试app下载-网络工程师考试 安卓版v3.0.7-PC6安卓网...
  19. 爱立信发布人体通信技术:最高传输10Mbps
  20. 华为emui10.0系统是鸿蒙吗,暂时忘记鸿蒙!华为EMUI 10.0发布时间确认:这才是主角...

热门文章

  1. MySQL 内置的监控工具介绍及使用篇
  2. 将多个文件压缩成gzip,将gzip解压成多个文件
  3. 你所表现的负责可能正是在逃避责任
  4. YOLO V5 CPU版本安装踩坑记录
  5. 面向对象写一个简单的学生管理系统
  6. 视频帧差法实例(matlab实现)
  7. 计算机毕业设计springboot+vue+elementUI学生公寓管理系统
  8. openGL中的坐标系
  9. java网上商城学年论文_基于java框架的网上购物商城程序(毕业设计)+论文
  10. android开发笔记之android.mk文件