0

我有一个 3D 图像,我想计算这个图像的高斯特征值的 Hessian。我想为每个体素获得 Hessian 近似的三个特征值。这个功能在图像处理中似乎很常见。

是否存在此功能的现有实现(例如用于拉普拉斯计算的 scipy.ndimage.laplace)?有没有一个与计算平行的?

我尝试通过 numpy 操作手动完成,但它不是最佳的,因为:

  1. 我必须计算所有体素上的 Hessian,这需要时间和大量 RAM

  2. 输出数据似乎非常嘈杂(可能是因为操作期间的数据类型转换)

  3. 特征值之和不等于拉普拉斯算子。

理想情况下,我只是在寻找现有的实现,我将此代码作为最后一条语句的示例。

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)

4

0 回答 0