灰度共生矩阵(GLCM)附Python代码
2018-03-06 22:47
661 查看
参考文献:Textural Features for Image Classification1.
度共生矩阵可以定义为一个灰度为ii的像素点与另一个与之对应位置上的像素点的灰度值为jj的概率。那么所有估计的值可以表示成一个矩阵的形式,以此被称为灰度共生矩阵。如:根据图像中任意一点 (x,y)(x,y) 的灰度值和它所对应的点 (x+dx,y+dy)(x+dx,y+dy) 的灰度值可以得到一个灰度值组合 (g1,g2)(g1,g2)。统计整福图像每一种灰度值组合出现的概率矩阵 PP 即为灰度共生矩阵。
由于灰度共生矩阵的维度较大,一般不直接作为区分纹理的特征,而是基于它构建的一些统计量作为纹理分类特征。例如HaralickHaralick曾提出了14种基于灰度共生矩阵计算出来的统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。
ASM=∑i∑jP(i,j)2ASM=∑i∑jP(i,j)2
ENT=−∑i∑jP(i,j)log(P(i,j))ENT=−∑i∑jP(i,j)log(P(i,j))
Con=∑i∑j(i−j)2P(i,j)Con=∑i∑j(i−j)2P(i,j)
IDM=∑i∑jP(i,j)1+(i−j)2IDM=∑i∑jP(i,j)1+(i−j)2
Python 代码如下
简介
灰度共生矩阵(Gray-Level Co-occurrence Matrix),一般简称GLCM。GLCM统计了灰度图中像素间的灰度值分布规律以区分不同的纹理。度共生矩阵可以定义为一个灰度为ii的像素点与另一个与之对应位置上的像素点的灰度值为jj的概率。那么所有估计的值可以表示成一个矩阵的形式,以此被称为灰度共生矩阵。如:根据图像中任意一点 (x,y)(x,y) 的灰度值和它所对应的点 (x+dx,y+dy)(x+dx,y+dy) 的灰度值可以得到一个灰度值组合 (g1,g2)(g1,g2)。统计整福图像每一种灰度值组合出现的概率矩阵 PP 即为灰度共生矩阵。
由于灰度共生矩阵的维度较大,一般不直接作为区分纹理的特征,而是基于它构建的一些统计量作为纹理分类特征。例如HaralickHaralick曾提出了14种基于灰度共生矩阵计算出来的统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。
举例几种常用的统计值
1.角二阶矩(Angular Second Moment, ASM)
角二阶矩又称能量,是图像灰度分布均匀程度和纹理粗细的一个度量,反映了图像灰度分布均匀程度和纹理粗细度。当图像纹理均一规则时,能量值较大;反之灰度共生矩阵的元素值相近,能量值较小。ASM=∑i∑jP(i,j)2ASM=∑i∑jP(i,j)2
2.熵(Entropy, ENT)
熵度量了图像包含信息量的随机性,表现了图像的复杂程度。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大。ENT=−∑i∑jP(i,j)log(P(i,j))ENT=−∑i∑jP(i,j)log(P(i,j))
3.对比度
对比度反应了图像的清晰度和纹理的沟纹深浅。纹理越清晰反差越大对比度也就越大。Con=∑i∑j(i−j)2P(i,j)Con=∑i∑j(i−j)2P(i,j)
4.反差分矩阵(Inverse Differential Moment, IDM)
反差分矩阵又称逆方差,反映了纹理的清晰程度和规则程度,纹理清晰、规律性较强、易于描述的,值较大。IDM=∑i∑jP(i,j)1+(i−j)2IDM=∑i∑jP(i,j)1+(i−j)2
Python 代码如下
#!/usr/bin/python # -*- coding: UTF-8 -*- import cv2 import math #定义最大灰度级数 gray_level = 16 def maxGrayLevel(img): max_gray_level=0 (height,width)=img.shape print height,width for 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+1 def 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.shape max_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_level for 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.0 for i in range(gray_level): for j in range(gray_level): ret[i][j]/=float(height*width) return ret def feature_computer(p): Con=0.0 Eng=0.0 Asm=0.0 Idm=0.0 for 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,Idm def test(): img = cv2.imread("test.bmp") try: img_shape=img.shape except: print 'imread error' return -1 img=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) print asm,con,eng,idm if __name__=='__main__': test()
参考文献
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. ↩相关文章推荐
- 灰度共生矩阵(GLCM) 及matlab代码实现
- 灰度共生矩阵(GLCM) 及matlab代码实现
- Python代码实现双色球原理
- Python实现日志自动记录功能(一个思路代码,详细可以自己扩展)
- 廖雪峰python教程之python代码运行助手
- python语言学习代码联系--small甲鱼课程学习
- 分析并输出Python代码依赖的库的实现代码
- python实现的代码行数统计(纯代码)
- Python 技巧:如何将一个列表list用一句代码改成列表中的列表
- python tornado微信开发入门代码
- 第一个完整的python代码(计时器)
- Python代码风格和PEP8
- 将Python代码嵌入C++程序进行编写
- python切换hosts文件代码示例
- python代码
- 如何把Python2的代码转换为Python3的代码
- 模糊K均值算法python代码实现(FCM)
- paip.输入法编程--英文ati化By音标原理与中文atiEn处理流程 python 代码为例
- 使用Python编写一个最基础的代码解释器的要点解析
- Python外壳:代码结构