当前位置:   article > 正文

【Python】灰度共生矩阵(GLCM)附Python代码_textural features for image classification

textural features for image classification

参考文献:Textural Features for Image Classification1.

代码地址:https://github.com/Code-0x00/pyCV

我自己的参考:https://github.com/mjiansun/Gray-Level-Cooccurrence-Matrix

简介

灰度共生矩阵(Gray-Level Co-occurrence Matrix,GLCM)统计了灰度图中像素间的灰度值分布规律以区分不同的纹理。

度共生矩阵可以定义为一个灰度为i ii的像素点与另一个与之对应位置上的像素点的灰度值为j jj的概率。那么所有估计的值可以表示成一个矩阵的形式,以此被称为灰度共生矩阵。如:根据图像中任意一点 ( x , y ) (x,y)(x,y) 的灰度值和它所对应的点 ( x + d x , y + d y ) (x+d_x,y+d_y)(x+dx​,y+dy​) 的灰度值可以得到一个灰度值组合 ( g 1 , g 2 ) (g_1,g_2)(g1​,g2​)。统计整福图像每一种灰度值组合出现的概率矩阵 P PP 即为灰度共生矩阵。

由于灰度共生矩阵的维度较大,一般不直接作为区分纹理的特征,而是基于它构建的一些统计量作为纹理分类特征。例如H a r a l i c k HaralickHaralick曾提出了14种基于灰度共生矩阵计算出来的统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。

举例几种常用的统计值

1.角二阶矩(Angular Second Moment, ASM)

角二阶矩又称能量,是图像灰度分布均匀程度和纹理粗细的一个度量,反映了图像灰度分布均匀程度和纹理粗细度。当图像纹理均一规则时,能量值较大;反之灰度共生矩阵的元素值相近,能量值较小。

2.熵(Entropy, ENT)

熵度量了图像包含信息量的随机性,表现了图像的复杂程度。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大。

3.对比度

对比度反应了图像的清晰度和纹理的沟纹深浅。纹理越清晰反差越大对比度也就越大。

4.反差分矩阵(Inverse Differential Moment, IDM)

反差分矩阵又称逆方差,反映了纹理的清晰程度和规则程度,纹理清晰、规律性较强、易于描述的,值较大。

Python 代码如下

  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. import cv2
  4. import math
  5. #定义最大灰度级数
  6. gray_level = 16
  7. def maxGrayLevel(img):
  8. max_gray_level=0
  9. (height,width)=img.shape
  10. print height,width
  11. for y in range(height):
  12. for x in range(width):
  13. if img[y][x] > max_gray_level:
  14. max_gray_level = img[y][x]
  15. return max_gray_level+1
  16. def getGlcm(input,d_x,d_y):
  17. srcdata=input.copy()
  18. ret=[[0.0 for i in range(gray_level)] for j in range(gray_level)]
  19. (height,width) = input.shape
  20. max_gray_level=maxGrayLevel(input)
  21. #若灰度级数大于gray_level,则将图像的灰度级缩小至gray_level,减小灰度共生矩阵的大小
  22. if max_gray_level > gray_level:
  23. for j in range(height):
  24. for i in range(width):
  25. srcdata[j][i] = srcdata[j][i]*gray_level / max_gray_level
  26. for j in range(height-d_y):
  27. for i in range(width-d_x):
  28. rows = srcdata[j][i]
  29. cols = srcdata[j + d_y][i+d_x]
  30. ret[rows][cols]+=1.0
  31. for i in range(gray_level):
  32. for j in range(gray_level):
  33. ret[i][j]/=float(height*width)
  34. return ret
  35. def feature_computer(p):
  36. Con=0.0
  37. Eng=0.0
  38. Asm=0.0
  39. Idm=0.0
  40. for i in range(gray_level):
  41. for j in range(gray_level):
  42. Con+=(i-j)*(i-j)*p[i][j]
  43. Asm+=p[i][j]*p[i][j]
  44. Idm+=p[i][j]/(1+(i-j)*(i-j))
  45. if p[i][j]>0.0:
  46. Eng+=p[i][j]*math.log(p[i][j])
  47. return Asm,Con,-Eng,Idm
  48. def test(image_name):
  49. img = cv2.imread(image_name)
  50. try:
  51. img_shape=img.shape
  52. except:
  53. print 'imread error'
  54. return
  55. img=cv2.resize(img,(img_shape[1]/2,img_shape[0]/2),interpolation=cv2.INTER_CUBIC)
  56. img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  57. glcm_0=getGlcm(img_gray, 1,0)
  58. #glcm_1=getGlcm(src_gray, 0,1)
  59. #glcm_2=getGlcm(src_gray, 1,1)
  60. #glcm_3=getGlcm(src_gray, -1,1)
  61. asm,con,eng,idm=feature_computer(glcm_0)
  62. return [asm,con,eng,idm]
  63. if __name__=='__main__':
  64. result = test("test.bmp")
  65. print(result)

 

参考文献


  1. Haralick R M, Shanmugam K, Dinstein I. Textural Features for Image Classification[J]. Systems Man & Cybernetics IEEE Transactions on, 1973, smc-3(6):610-621. ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/191021
推荐阅读
相关标签
  

闽ICP备14008679号