我有一个 3D 图像,我想计算这个图像的高斯特征值的 Hessian。我想为每个体素获得 Hessian 近似的三个特征值。这个功能在图像处理中似乎很常见。
是否存在此功能的现有实现(例如用于拉普拉斯计算的 scipy.ndimage.laplace)?有没有一个与计算平行的?
我尝试通过 numpy 操作手动完成,但它不是最佳的,因为:
我必须计算所有体素上的 Hessian,这需要时间和大量 RAM
输出数据似乎非常嘈杂(可能是因为操作期间的数据类型转换)
特征值之和不等于拉普拉斯算子。
理想情况下,我只是在寻找现有的实现,我将此代码作为最后一条语句的示例。
import numpy as np
import scipy.ndimage as sn
import h5py
import time
def hessian_eigenvalues(x,Mask):
H=hessian(x)
t2=time.time()
print(" Calculate feature: Hessian eigenvalues")
eigen=np.linalg.eigvals(H[Mask])
print(" Feature calculated ---time: ",time.time()-t2)
del H
return eigen
def hessian(x):
t2=time.time()
print(" Calculate feature: Hessian ")
x_grad = np.gradient(x)
hessian = np.empty(x.shape + (x.ndim, x.ndim) , dtype=x.dtype)
for k, grad_k in enumerate(x_grad):
# iterate over dimensions
# apply gradient again to every component of the first derivative.
tmp_grad = np.gradient(grad_k)
for l, grad_kl in enumerate(tmp_grad):
hessian[ :, :,:,k, l] = grad_kl
print(" Feature calculated ---time: ",time.time()-t2)
return hessian
t2=time.time()
print(" Loading special feature: raw datas ")
raw=h5py.File(r"Datas\9003\Variables\raw.h5", 'r')
Base_data=np.asarray(raw['exported_data'][:,:,:],dtype=np.uint16)
raw.close
print(" Feature loaded ---time: ",time.time()-t2)
t2=time.time()
print(" Loading special feature: masque")
m = h5py.File(r"Datas\9003\Masques\9003_masque.h5", 'r')
Mask=np.nonzero(m["exported_data"][:,:,:])
m.close
print(" Feature loaded ---time: ",time.time()-t2)
eig = hessian_eigenvalues(Base_data,Mask)