1
# -*- coding: utf-8 -*-
6
class SiftEMDDistanceComputer:
7
def __init__(self,XNBP= 4 ,YNBP= 4, NBO= 8,thresh= 5,extra_mass_penalty= -1,flowType=1,dt=None):
8
self.XNBP= XNBP # SIFT's X-dimension
9
self.YNBP= YNBP # SIFT's Y-dimension
10
self.NBO= NBO # SIFT's Orientation-dimension
13
self.extra_mass_penalty= extra_mass_penalty # Default of maximum distance
14
self.flowType= flowType # Regular flows
15
#self.D= numpy.zeros((self.N,self.N));
16
print "computing siftdistance mat"
17
siftenum=numpy.vstack(map(numpy.array,numpy.ndindex((YNBP,XNBP,NBO))))
18
self.D=scipy.spatial.distance.cdist(siftenum,siftenum,lambda x,y: (x[0]-y[0])**2 + (x[1]-y[1])**2 + min(abs(x[2]-y[2]),NBO-abs(x[2]-y[2])))
19
assert((self.D>=0).all())
20
assert((self.D==self.D.T).all())
21
print "/computing siftdistance mat"
23
self.D[self.D>self.thresh]=self.thresh
25
self.D=self.D.astype(dt)
28
def distance(self,P,Q):
33
if (self.flowType==1):
34
return pyfastemd.emd_hat(P.astype(dt),Q.astype(dt),self.D.astype(dt),self.extra_mass_penalty,self.flowType)
36
flow=numpy.zeros((self.N,self.N),dtype=dt)
37
r=pyfastemd.emd_hat(P.astype(dt),Q.astype(dt),self.D.astype(dt),self.extra_mass_penalty,self.flowType,flow)
41
shared_sift_emd_dist_computer=None
43
def siftemd_distance(P,Q):
44
global shared_sift_emd_dist_computer
45
if shared_sift_emd_dist_computer==None:
46
shared_sift_emd_dist_computer=SiftEMDDistanceComputer(dt=numpy.float64)
47
return shared_sift_emd_dist_computer.distance(P,Q)
b'\\ No newline at end of file'