NMI(标准化互信息) python实现

介绍

NMI是社区发现(community detection)在有标准ground-truth的情况下的重要衡量指标,基本可以比较客观地评价出一个社区划分与标准划分之间相比的准确度。NMI的值域是0到1,越高代表划分得越准。具体的原理和例子可以参考这篇博客:http://www.cnblogs.com/ziqiao/archive/2011/12/13/2286273.html
因为之前自己要用到,但是发现在网上现成的计算NMI的代码基本都是matlab的和java的,没找到用python写的。所以今天闲来无事,把上面博客中的matlab实现方法用python实现了一下。将来就可以直接用了。

代码

其实代码很简单,就是参考博客中直接从matlab翻译成python,不过有一些小坑而已。
python代码
直接给代码,跟博客中的没什么区别啦,这里解释一下代码中的eps是一个很小的正数,为了防止log函数中参数为0而已。
为了方便大家使用python的话可以直接用,最后附有下载地址。

结果

使用代码中的用例,可以看到,如果输出的结果是0.36456,说明结果就是正确的。

下载地址

CDNS下载
没积分的也可以github下载:
github下载链接
记得给star喔~

### NII图像归一化互信息Python实现 归一化互信息(Normalized Mutual Information, NMI)是一种常用的医学影像配准指标,用于衡量两幅图像之间的相似性。以下是一个基于Python实现NII图像归一化互信息计算的方法[^1]。 #### 方法概述 归一化互信息可以通过联合概率分布和边缘概率分布计算得出。具体步骤包括: 1. 加载NII图像数据。 2. 计算两幅图像的联合直方图。 3. 根据联合直方图计算联合熵和边缘熵。 4. 使用熵值计算归一化互信息。 以下是实现代码示例: ```python import nibabel as nib import numpy as np from scipy.stats import entropy def load_nii_image(file_path): """加载NII图像并返回其数据""" img = nib.load(file_path) return img.get_fdata() def compute_joint_histogram(img1, img2, bins=64): """计算两幅图像的联合直方图""" hist, _, _ = np.histogram2d( img1.ravel(), img2.ravel(), bins=bins, range=[[np.min(img1), np.max(img1)], [np.min(img2), np.max(img2)]] ) return hist / hist.sum() # 归一化 def compute_entropy(prob_dist): """计算熵值""" return -np.sum(prob_dist * np.log2(prob_dist + 1e-10)) # 避免除零错误 def compute_normalized_mutual_information(img1, img2, bins=64): """计算归一化互信息""" joint_hist = compute_joint_histogram(img1, img2, bins) joint_entropy = compute_entropy(joint_hist.flatten()) marginal_hist_img1 = joint_hist.sum(axis=1) marginal_hist_img2 = joint_hist.sum(axis=0) entropy_img1 = compute_entropy(marginal_hist_img1) entropy_img2 = compute_entropy(marginal_hist_img2) mutual_information = (entropy_img1 + entropy_img2) - joint_entropy normalized_mutual_information = (2 * mutual_information) / (entropy_img1 + entropy_img2) return normalized_mutual_information # 示例:加载两幅NII图像并计算归一化互信息 if __name__ == "__main__": img1_path = "image1.nii" img2_path = "image2.nii" img1_data = load_nii_image(img1_path) img2_data = load_nii_image(img2_path) nmi = compute_normalized_mutual_information(img1_data, img2_data) print(f"归一化互信息: {nmi}") ``` #### 注意事项 - 在实际应用中,可能需要对图像进行预处理(如去噪、标准化等),以提高计算结果的准确性[^2]。 - 联合直方图的分箱数(`bins`)会影响计算结果,建议根据图像特性选择合适的值。 - 对于大规模图像数据,可以考虑使用GPU加速或优化算法以提高计算效率。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值