Python - pyradiomics - 邻域灰阶依赖性矩阵(Neighboring Gray Level Dependence Matrix)

文章目录


有关邻域灰阶依赖性矩阵(Neighboring Gray Level Dependence Matrix, NGLDM)的一切的起源:

Sun C, Wee WG. Neighboring Gray Level Dependence Matrix for Texture Classification. Comput Vision, Graph Image Process. 1983;23:341-352

参考文件:

https://pyradiomics.readthedocs.io/en/latest/features.html#module-radiomics.gldm

理论

对于两个像素依赖性的判断,是基于他们的距离和他们像素值的差异得到的。对于某一个像素点,其像素值为L0,在与它距离delta范围内的像素中,如果某个像素点的像素值L1与它相差不超过alpha,则判断周围像素L1依赖于中心像素L0,即
L 1   i s   d e p e n d e n t   o n   L 0   i f   ∣ L 1 − L 0 ∣ ≤ α L1\ is\ dependent\ on\ L0\ if\ |L1-L0|\le\alpha L1 is dependent on L0 if L1L0α
在pyradiomics源码中,delta默认取值为1,alpha默认取值为0,即中心像素点周围8个像素(或26个像素)中,和中心像素值相同的,判断为依赖于中心像素。

以一个二维图像 I 为例:
请添加图片描述
它的NGLDM为:
请添加图片描述
以第五行为例,4和2表示在像素值等于从小到大第五个像素值的像素中,有4个像素周围没有和自己相同的像素,有2个像素周围有一个和自己相同的像素。
设行数为i,列数为j,图像中灰阶构成一维数组N_g,P(i, j)表示像素值等于N_g(i)、周围有j-1个依赖像素的像素的个数。

Python实操

创建图像矩阵

import numpy as np

img_array = np.array([
[5, 2, 5, 4, 4, 6, 8], 
[3, 3, 3, 1, 3, 2, 5], 
[2, 1, 1, 2, 6, 1, 3], 
[4, 2, 2, 1, 8, 2, 3], 
[3, 5, 1, 2, 3, 3, 2], 
[5, 2, 8, 3, 4, 1, 6], 
[2, 6, 2, 6, 3, 5, 2]
])

计算NGLDM的第一步,是将所有像素值从小到大排列,获得每个像素值的索引,I 中没有像素值为7的点,因此像素值为8的点的索引值是第7个:

grey_levels = np.unique(img_array)
grey_levels_rank = dict(zip(grey_levels, range(len(grey_levels))))
print(grey_levels)
print(grey_levels_rank)
'''
[1 2 3 4 5 6 8]
{1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 8: 6}
'''

初始化NGLDM矩阵

dimension = 2
NGLDM = np.zeros((len(grey_levels_rank), 3 ** dimension))
print(NGLDM.shape)
'''
(7, 9)
'''

开始填充NGLDM矩阵,不追求速度的方法,就是从(1, 1)点开始遍历每个像素值Li,先求的它周围的像素点的坐标,然后计算有多少个依赖于它n,然后在NGLDM第i行第n列处+1

设一个点坐标为(x, y),那在二维平面内,它周围delta = 1的点为:
请添加图片描述

定义一个能返回周围像素点坐标的函数

def surrounding_2d(x, y):
	surroundings = [
	(x - 1, y - 1), (x, y - 1), (x + 1, y - 1), 
	(x - 1, y), (x + 1, y), 
	(x - 1, y + 1), (x, y + 1), (x + 1, y + 1)
	]
	return surroundings
#也可以用numpy.meshgrid()来做

开始遍历:

alpha = 0
for x in range(img_array.shape[0]):
	for y in range(img_array.shape[1]):
		dependence = 0
		for (x_s, y_s) in surrounding_2d(x,y):
			if (0 <= x_s < img_array.shape[0]) and (0 <= y_s < img_array.shape[1]):#坐标值在边缘内
				if abs(img_array[x_s, y_s] - img_array[x, y]) <= alpha:#依赖性判断
					dependence += 1
		NGLDM[grey_levels_rank[img_array[x, y]], dependence] += 1

然后就得到NGLDM了~

print(NGLDM)
'''
[[2. 3. 1. 1. 0. 0. 0. 0. 0.]
 [3. 7. 2. 1. 0. 0. 0. 0. 0.]
 [2. 4. 5. 0. 0. 0. 0. 0. 0.]
 [2. 2. 0. 0. 0. 0. 0. 0. 0.]
 [4. 2. 0. 0. 0. 0. 0. 0. 0.]
 [5. 0. 0. 0. 0. 0. 0. 0. 0.]
 [3. 0. 0. 0. 0. 0. 0. 0. 0.]]
'''
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值