『youcans 的 OpenCV 例程200篇 - 总目录』
【youcans 的 OpenCV 例程 300篇】231. 特征描述之灰度共生矩阵(GLCM)
4.2.4 灰度共生矩阵(GLCM)
灰度共生矩阵(Gray level co-occurrence matrix,GLCM)是特征检测与分析的重要方法,在纹理分析、特征分类、图像质量评价中应用广泛 。
灰度共生矩阵是一种典型的统计方法,描述空间上具有某种分布规律的灰度值组合出现的概率。
图像的像素具有不同的灰度级,灰度共生矩阵表示不同灰度组合同时出现的频率。简单地说,灰度共生矩阵反映灰度图像中某种形状的像素对在整个图像中出现的次数。
灰度共生矩阵的定义是,从灰度为 i i i 的像素点出发,距离 ( a , b ) (a,b) (a,b) 的另一像素点 ( x + a , y + b ) (x+a,y+b) (x+a,y+b) 的灰度为 j j j 的概率。所有的估计值表示为矩阵矩式,称为灰度共生矩阵。
灰度共生矩阵在点 (x,y) 处的值,表示了特定灰度值组合在图像中出现的频次:
P
(
i
,
j
∣
a
,
b
,
θ
)
=
{
(
x
,
y
)
∣
f
(
x
,
y
)
=
i
,
f
(
x
+
a
,
y
+
b
)
=
j
}
,
x
,
y
=
0
,
1...
L
−
1
P(i,j|a,b,\theta) = \{ (x,y)|f(x,y)=i,f(x+a,y+b)=j \}, \quad x,y =0,1...L-1
P(i,j∣a,b,θ)={(x,y)∣f(x,y)=i,f(x+a,y+b)=j},x,y=0,1...L−1
式中:
a , b a, b a,b 为距离差分值,也称相邻间隔、偏移量,要根据纹理周期分布的特性来选择,无特性参数时取 1(像素);
θ \theta θ 为扫描方向,通常选择 0 o 、 4 5 o 、 9 0 o 、 13 5 o 0^o、45^o、90^o、135^o 0o、45o、90o、135o ,对应以水平、垂直和左右对角线方向扫描像素对组合;
i , j = 0 , . . . L − 1 i,j=0,...L-1 i,j=0,...L−1 表示像素的灰度级。灰度级 L=256 时即为灰度值,也可以取其它灰度级如 L=8,16。共生矩阵有方向和步长的组合,是一个稀疏矩阵,灰度级划分常常减少到8级。显然,灰度共生矩阵的尺寸为 L*L,而与图像尺寸无关。
例如,取 a = 1 , b = 1 , θ = 0 o a=1, b=1, \theta=0^o a=1,b=1,θ=0o 时, P ( 1 , 1 ) P(1,1) P(1,1) 是水平相邻像素对的灰度级为 (1,1) 的组合数量, P ( 2 , 8 ) P(2,8) P(2,8) 是水平相邻像素对的灰度级为 (2,8) 的组合数量, P ( i , j ) P(i,j) P(i,j) 是水平相邻像素对的灰度级为 (i,j) 的组合数量。
也就是说,灰度共生矩阵中点 (i,j) 的值,就是灰度值为 i,j 的联合概率密度。因此,灰度共生矩阵能反映出图象灰度关于方向、相邻间隔、变化幅度的综合信息,是分析图象的局部模式和它们排列规则的基础。
粗纹理的区域,像素对趋于具有相同的灰度,灰度共生矩阵对角线上的数值较大;细纹理的区域,对角线上的数值相对较小,对角线两侧的值相对较大。
灰度共生矩阵的数据量很大,一般不直接用它来描述纹理特征,而是构建一些统计量作为纹理分类特征。例如,能量、熵、对比度、均匀性、相关性、方差等。
(1)能量(Energy), 是灰度共生矩阵元素值的平方和,反映图像灰度分布均匀程度和纹理粗细。ASM值大表明一种较均一和规则变化的纹理模式。
E
n
e
r
g
y
=
∑
i
,
j
=
0
N
−
1
(
P
i
j
)
2
Energy = \sum ^{N-1} _{i,j=0} (P_{ij})^2
Energy=i,j=0∑N−1(Pij)2
(2)熵(Entropy),是图像所具有的信息量的度量,反映图像中纹理的非均匀程度或复杂程度。共生矩阵中的元素分布越分散,随机性越大,熵值就越大。
E
n
t
r
o
p
y
=
∑
i
,
j
=
0
N
−
1
−
l
n
(
P
i
j
)
P
i
j
Entropy = \sum ^{N-1} _{i,j=0} -ln(P_{ij})P_{ij}
Entropy=i,j=0∑N−1−ln(Pij)Pij
(3)对比度(Contrast),度量灰度共生矩阵的局部变化,反映了图像的清晰度和纹理沟纹深浅的程度。纹理的沟纹越深,对比度越大,视觉效果越清晰。
C
o
n
t
r
a
s
t
=
∑
i
,
j
=
0
N
−
1
P
j
j
(
i
−
j
)
2
Contrast = \sum ^{N-1} _{i,j=0} P_{jj}(i-j)^2
Contrast=i,j=0∑N−1Pjj(i−j)2
(4)相关性(Correlation),度量灰度共生矩阵在行或列方向上的相似程度, 反映了图像中局部灰度相关性 。如果图像具有水平方向的纹理,则水平方向的相关性就会显著地大于其它方向的相关性。
C
o
r
r
e
l
a
t
i
o
n
=
∑
i
,
j
=
0
M
−
1
P
(
i
,
j
)
(
i
−
μ
)
(
j
−
μ
)
σ
2
Correlation = \sum_{i,j=0}^{M-1} P(i,j)\frac{(i-\mu)(j-\mu)}{\sigma ^2}
Correlation=i,j=0∑M−1P(i,j)σ2(i−μ)(j−μ)
(5)反差分矩阵(Inverse Differential Moment, IDM),反映了纹理的清晰程度和规则程度。
(6)同质性(Homogeneity),反映了图像纹理的同质性,度量图像纹理局部变化的程度。
例程 14.11:特征描述之灰度共生矩阵(skimage)
skimage 的特征提取库 skimage.feature 提供了函数 greycomatrix 和 greycoprops,可以 计算灰度共生矩阵并提取特征统计量 。
函数说明:
skimage.feature.graycomatrix(image, distances, angles, levels=256, symmetric=False, normed=False)
skimage.feature.graycoprops(P[, prop])
参数说明:
- image:整型单通道图像,推荐使用 uint8 灰度图像
- distances:像素对的距离偏移量的列表,计算列表中每个偏移量的 GLCM
- angles:像素对扫描角度(弧度)列表,计算列表中每个角度值的 GLCM
- levels:灰度级,默认值为 256
- symmetric:对称性选项,默认值 False 表示将像素对 (i,j) 与 (j,i) 分别计算,True 表示忽略像素对顺序,将 (i,j) 与 (j,i) 视为相同
- normed:归一化选项,默认值 False,True 表示对矩阵归一化。
- prop:元组,灰度共生矩阵 P 的特征统计量, 包括:对比度 ‘contrast’、相异性 ‘dissimilarity’、同质性 ‘homogeneity’、能量 ‘energy’、相关性 ‘correlation’、能量的平方 ‘ASM’}
- 返回值是 4维数组,即不同偏移量、不同角度的 GLCM。 P [ i , j , d , θ ] P[i,j,d,\theta] P[i,j,d,θ] 是灰度 j 在偏移量 d、角度 θ \theta θ 处出现灰度 i 的次数。
# 14.11 特征描述之灰度共生矩阵 (skimage)
from skimage.feature import greycomatrix, greycoprops
img = cv2.imread("../images/fabric1.png", flags=1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像
height, width = gray.shape
table16 = np.array([(i//16) for i in range(256)]).astype("uint8") # 16 levels
gray16 = cv2.LUT(gray, table16) # 灰度级压缩为 [0,15]
# 计算灰度共生矩阵 GLCM
dist = [1, 4] # 计算 2 个距离偏移量 [1, 2]
degree = [0, np.pi/4, np.pi/2, np.pi*3/4] # 计算 4 个方向
glcm = greycomatrix(gray16, dist, degree, levels=16) # 灰度级 L=16
print(glcm.shape) # (16,16,2,4)
# 由灰度共生矩阵 GLCM 计算特征统计量
for prop in ['contrast', 'dissimilarity','homogeneity', 'energy', 'correlation', 'ASM']:
feature= greycoprops(glcm, prop).round(4) # (2,4)
print("{}: {}".format(prop, feature))
plt.figure(figsize=(9, 6))
plt.suptitle("GLCM by skimage, youcans")
for i in range(len(dist)):
for j in range(len(degree)):
plt.subplot(2,4,i*4+j+1), plt.axis('off')
plt.title(r"d={},$\theta$={:.2f}".format(dist[i], degree[j]))
plt.imshow(glcm[:,:,i,j], 'gray')
plt.tight_layout()
plt.show()
运行结果:
(16, 16, 2, 4)
contrast: [[ 4.5689 3.8755 1.7764 7.0276], [12.2668 12.6184 8.0537 13.614 ]]
dissimilarity: [[1.3346 1.3228 0.8727 1.7466], [2.3169 2.4697 1.9752 2.5845]]
homogeneity: [[0.5843 0.5477 0.6474 0.5072], [0.4539 0.4051 0.4422 0.3948]]
energy: [[0.1262 0.1186 0.1388 0.1103], [0.1003 0.0936 0.0997 0.0907]]
correlation: [[0.8558 0.8778 0.9439 0.7783], [0.6133 0.6031 0.7465 0.5717]]
ASM: [[0.0159 0.0141 0.0193 0.0122], [0.0101 0.0088 0.0099 0.0082]]
【本节完】
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125693533)
Copyright 2022 youcans, XUPT
Crated:2022-7-9
227. 特征描述之 LBP 纹理特征算子
229. 特征描述之 LBP 算子比较(skimage)
231. 特征描述之 灰度共生矩阵(GLCM)