En utilisant apply_along_axis
, vous pouvez vous débarrasser de cauchy_schwartz
. Puisque vous n'êtes pas trop préoccupé par le temps de prétraitement, supposez que vous avez obtenu le tableau params
qui contient les patchs aplatis
params = np.random.rand(3,2,100)
comme vous pouvez voir la forme de params
est (3,2,100)
, les trois nombres 3, 2 et 100 sont juste choisis au hasard pour créer un tableau auxiliaire pour démontrer la logique d'utilisation de apply_along_axis
. 3 correspond au nombre de patchs que vous avez (déterminé par la forme du patch et la taille de l'image), 2 correspond aux deux images et 100 correspond aux patchs aplatis. Par conséquent, les axes de params
est (idx of patches, idx of images, idx of entries of a flattened patch)
, cela correspond exactement à la liste params
créé par votre code
params = []
for i in range(0,patch1.shape[0],1):
for j in range(0,patch1.shape[1],1):
window1 = np.copy(imga[i:i+N,j:j+N]).flatten()
window2 = np.copy(imgb[i:i+N,j:j+N]).flatten()
params.append((window1, window2))
Avec le tableau auxiliaire params
, voici ma solution :
hist = np.apply_along_axis(lambda x: np.histogram(x,bins=11)[0],2,params)
hist = hist / np.sum(hist,axis=2)[...,None]
n_d = np.sum(np.product(hist,axis=1),axis=1)
d_d = np.sum(np.product(np.power(hist,2),axis=1),axis=1)
res = -1.0 * np.log10(n_d, d_d)