def SID_classifier(M, E, threshold):
"""
Classify a HSI cube M using the spectral information divergence
and a spectral library E.
This function is part of the NormXCorr class.
Parameters
M : numpy array
a HSI cube ((m*n) x p)
E : numpy array
a spectral library (N x p)
Returns : numpy array
a class map ((m*n))
"""
def prob_vector_array(m):
pv_array = np.ndarray(shape=m.shape, dtype=np.float32)
sum_m = np.sum(m, axis=1)
pv_array[:] = (m.T / sum_m).T
return pv_array + np.spacing(1)
mn = M.shape[0]
N = E.shape[0]
p = prob_vector_array(M)
q = prob_vector_array(E)
sid = np.ndarray((mn, N), dtype=np.float)
for i in range(mn):
pq = q[0:,:] * np.log(q[0:,:] / p[i,:])
pp = p[i,:] * np.log(p[i,:] / q[0:,:])
sid[i,:] = np.sum(pp[0:,:] + pq[0:,:], axis=1)
if isinstance(threshold, float):
cmap = _single_value_min(sid, threshold)
elif isinstance(threshold, list):
cmap = _multiple_values_min(sid, threshold)
else:
return np.argmin(sid, axis=1), sid
return cmap, sid
评论列表
文章目录