最近在写一个归一化互信息的方法,由于电脑性能不够对于算法进行了若干次优化,获得了基本和c语言速度相似的归一化互信息计算速度
代码如下
import numpy as np
import math
import pandas as pd
def H_Matrix(M): #M为图像矩阵
s = pd.Series(M.reshape(-1))
M_array = KKSK.values.tolist()
M_array = np.array(M_array)
HM = 0 # HM 熵 H(Matrix)
HM = HM - M_array * np.log2(M_array)
HM = np.sum(HM)
return HM
def H_Joint(M1): # M1是两层数组,两幅图像重叠部分
M1 = M1.reshape(2, (M1.shape[1] * M1.shape[2])) # 重构数组到二维
M1 = M1.T
M2 = M1[::, 0] * np.max(M1[::, 1]) + M1[::, 1]
s = pd.Series(M2)
Mhist = s.value_counts(normalize=True)
a = M1.shape[0]
HM = 0
HM = HM - (Mhist * np.log2(Mhist))
HM = np.sum(HM)
return HM
def NMI(M): # 定义NMI #M为两层数组
return (H_Matrix(M[0]) + H_Matrix(M[1])) / H_Joint(M)