Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 8571f358 authored by INGELS Florian's avatar INGELS Florian
Browse files

Several minor improvements / WIP

parent 2e5aad08
No related branches found
No related tags found
No related merge requests found
Pipeline #161014 passed
......@@ -94,6 +94,7 @@ class AffineTransform(object):
from visu_core.matplotlib.colormap import plain_colormap
from visu_core.vtk.actor import vtk_actor
from visu_core.vtk.polydata import face_scalar_property_polydata
#TODO : doc + correct scale (in visu_core)
qr = np.sqrt(chi2.ppf(alpha, 3))
T = self.linear
......
def assign_ids_to_dag(dag, t, tree_type):
# a deplacer dans treex ?
node = t.get_attribute(tree_type + '_equivalence_class')
attr = dag.get_attribute(node)
if "tree_ids" in attr.keys():
tree_id = attr['tree_ids']
else:
tree_id = []
tree_id.append(t.my_id)
dag.add_attribute_to_node("tree_ids", tree_id, node)
for child in t.my_children:
assign_ids_to_dag(dag, child, tree_type)
......@@ -39,14 +39,13 @@ class GeomTree(Tree):
# child.update_relative_geometry()
def get_actor(self,axis=False,alpha=0.95,opacity=0.2,relative=False, show_ellipsoid=True):
from visu_core.vtk.primitive_actors import segment_primitive, point_cloud_primitive
actors = []
i=1
self.__get_recursive_actor(actors,i,axis,alpha,opacity,relative,show_ellipsoid)
return actors
def __get_recursive_actor(self,actors,i,axis,alpha,opacity,relative,show_ellipsoid):
from visu_core.vtk.primitive_actors import segment_primitive, point_cloud_primitive
if show_ellipsoid:
if relative:
actors += self.my_relative_geometry.get_actor(color='glasbey_' + str(i), axis=axis, alpha=alpha,
......@@ -68,7 +67,7 @@ class GeomTree(Tree):
d = child.my_relative_geometry.translation
else:
d = child.my_absolute_geometry.translation
actors+=[segment_primitive(c,d,color='#808080')]
actors+=[segment_primitive(c,d,color='#808080',lw=1)] ### epaisseur du segment ! #TODO: gerer par un argument l'epaisseur
child.__get_recursive_actor(actors,i,axis,alpha,opacity,relative,show_ellipsoid)
def apply_tf(self,tf,relative=False):
......@@ -92,15 +91,15 @@ def align_centers(t1,t2,tree_type="unordered", rmsd=True):
"""
If the two trees are isomorphic, find the best alignment of centers of the two trees via Kabsch algorithm
"""
assert t1.is_isomorphic_to(t2, tree_type), "Trees are not isomorphic"
bool, mapp = t1.is_isomorphic_to(t2, tree_type,mapping=True)
assert bool, "Trees are not isomorphic"
geom1 = t1.get_geometry()
geom2 = t2.get_geometry()
# TODO: s'occuper mieux des isomorphismes, la ça marche par la grace divine et la chance
p = np.array([geom1[k].translation for k in geom1.keys()])
q = np.array([geom2[k].translation for k in geom2.keys()])
p=np.array([geom1[k].translation for k in mapp.keys()])
q=np.array([geom2[mapp[k]].translation for k in mapp.keys()])
if rmsd:
print("RMSD before processing : ", np.linalg.norm(p - q)/np.sqrt(len(p)))
......@@ -123,21 +122,24 @@ def align_centers(t1,t2,tree_type="unordered", rmsd=True):
tf = AffineTransform()
tf.set_parameters(linear=R, translation=cp - R @ cq)
#return tf.inverse(), np.linalg.norm(p - q)/np.sqrt(len(p))
return tf, np.linalg.norm(p - q)/np.sqrt(len(p))
def tree_hellinger_distance(t1,t2,tree_type="unordered",relative=[False,False]):
assert t1.is_isomorphic_to(t2, tree_type), "Trees are not isomorphic"
bool, mapp = t1.is_isomorphic_to(t2, tree_type,mapping=True)
assert bool, "Trees are not isomorphic"
geomu = t1.get_geometry(relative=relative[0])
geomv = t2.get_geometry(relative=relative[1])
p = [geomu[k] for k in geomu.keys()]
q = [geomv[k] for k in geomv.keys()]
p=np.array([geomu[k] for k in mapp.keys()])
q=np.array([geomv[mapp[k]] for k in mapp.keys()])
f = 0
for i in range(len(p)):
f += hellinger_distance(p[i], q[i])
return f
return f/t1.get_property('size') #pour rester dans [0,1]
def tree_to_geomtree(t):
gt = GeomTree(random_transform())
......@@ -151,4 +153,13 @@ def tree_to_geomtree(t):
# vtk_display_actors(actors,background=(0.9,0.9,0.9))
# from geomtree import *
# from visu_core.vtk.actor import vtk_display_actors as display
#
# tf=random_transform()
#
# pc1 = tf.sample_points(n=1000,method='uniform')
# pc2 = tf.sample_points(n=1000)
#
# display(tf.get_actor(opacity=0.1)+pc2.get_actor(glyph='sphere',scale=0.1))
# display(tf.get_actor(opacity=0.1,alpha=chi2.cdf(1,3))+pc1.get_actor(glyph='sphere',scale=0.1))
......@@ -224,7 +224,7 @@ class PointCloud(object):
return abs(np.log10(l1/l2)) < np.log10(evidence)
def intersection_filter_bis(self,tf1,tf2,evidence=10):
K = 2 * np.log(evidence)
K = 2 * np.log(evidence) #TODO: vérifier que 2 est correct
filter=[]
for vec in self.cloud:
m1 = mahalanobis(vec, tf1.translation, inv(tf1.get_covariance_matrix()))**2
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment