Statistiques
| Révision :

root / bin / image2geometry / orient_sepal.py @ 4

Historique | Voir | Annoter | Télécharger (3,49 ko)

1 1 akiss
#!/usr/bin/env python
2 1 akiss
3 1 akiss
'''
4 1 akiss
Usage:
5 1 akiss
orient_object.py filename output.txt
6 1 akiss

7 1 akiss
- filename = path and name of the stack file containing the object (background=0)
8 1 akiss

9 1 akiss
Output:
10 1 akiss
the image with the object reoriented:
11 1 akiss
- CM in the middle of the image
12 1 akiss
- first principal axis along y
13 1 akiss
- second principal axis along x
14 1 akiss

15 1 akiss
'''
16 1 akiss
17 1 akiss
from sys import argv
18 1 akiss
import os
19 1 akiss
import numpy as np
20 1 akiss
from scipy.ndimage.morphology import binary_closing, binary_opening
21 1 akiss
22 4 akiss
from titk_tools.io import imread, imsave, tfread, SpatialImage
23 4 akiss
from titk_tools.registration import isotropic_resampling_seg
24 4 akiss
from titk_tools.registration import apply_transfo_on_seg1
25 1 akiss
26 1 akiss
from bib_sepals import *
27 1 akiss
28 1 akiss
print('============== orient_sepal.py =================')
29 1 akiss
30 1 akiss
filename = argv[1]
31 4 akiss
outputdir=argv[2]+'/'
32 1 akiss
33 1 akiss
print(argv)
34 1 akiss
35 1 akiss
imname = filename.split('/')[-1]
36 1 akiss
imnameroot = imname.split('.')[0]
37 1 akiss
38 1 akiss
outfilename = outputdir+imnameroot+'_oriented.inr.gz'
39 1 akiss
40 4 akiss
# read the image
41 4 akiss
sepale=imread(filename)
42 1 akiss
# resample isotropically
43 1 akiss
print("----------------------")
44 1 akiss
print("isotropic resampling of : filename=", filename)
45 1 akiss
print("----------------------")
46 1 akiss
voxelsize = sepale.voxelsize
47 1 akiss
print("voxelsize=",voxelsize)
48 1 akiss
s = sepale.shape
49 1 akiss
print("shape=",s)
50 1 akiss
51 1 akiss
radius=int(voxelsize[2]/voxelsize[0])
52 1 akiss
isovs=(voxelsize[0]*voxelsize[1]*voxelsize[2])**(1.0/3)
53 1 akiss
#isovs=voxelsize[0]
54 1 akiss
print("new voxelsize=",isovs)
55 1 akiss
56 1 akiss
sepale=SpatialImage(sepale>0, dtype='uint8', voxelsize=voxelsize, origin=[0, 0, 0])
57 4 akiss
sepale=isotropic_resampling_seg(sepale,isovs)
58 1 akiss
59 1 akiss
s = sepale.shape
60 1 akiss
voxelsize = sepale.voxelsize
61 1 akiss
print('new shape', s)
62 1 akiss
63 4 akiss
64 1 akiss
# alongate the target image so that a sepal originally along the diagonal fits into the target image
65 1 akiss
print("----------------------")
66 1 akiss
print("elongating field : filename=", filename)
67 1 akiss
print("----------------------")
68 1 akiss
s_addy=int((np.sqrt(s[0]*s[1]*2)-np.sqrt(s[0]*s[1]))/2)
69 1 akiss
s_addz=int(s[2]*0.20)
70 4 akiss
sepale=add_side_slices(sepale, 0, 0, s_addy, s_addy, s_addz, s_addz)
71 1 akiss
72 4 akiss
'''
73 1 akiss
# smooth it with opening
74 4 akiss
#sepale=imread(isoname)
75 1 akiss
s = sepale.shape
76 1 akiss
voxelsize = sepale.voxelsize
77 1 akiss
struct_el=struct_element_sphere(radius)
78 1 akiss
sepale = binary_closing(sepale, structure=struct_el, iterations=int(radius))
79 1 akiss
struct_el=struct_element_sphere(radius/2)
80 1 akiss
sepale = binary_closing(sepale, structure=struct_el, iterations=int(radius/2))
81 1 akiss
sepale=SpatialImage(sepale*255, dtype='uint8', voxelsize=voxelsize, origin=[0, 0, 0])
82 4 akiss
#imsave(sname, sepale)
83 4 akiss
'''
84 1 akiss
85 1 akiss
# put the center of mass in the center of the image
86 1 akiss
sepale_centered=center_on_cm(sepale)
87 1 akiss
88 1 akiss
# compute principal directions
89 4 akiss
pv_flo=principal_directions(sepale_centered*255)
90 1 akiss
print(pv_flo)
91 1 akiss
92 1 akiss
# sepals originally are oriented with top in more-or less "up" direction on the images
93 1 akiss
# while the eigenvectors' orientation is arbitrary
94 1 akiss
# --> do not change the original rough orientation
95 1 akiss
96 1 akiss
# check logitudinal direction:
97 1 akiss
if pv_flo[0][1]<0 :
98 1 akiss
        pv_flo[0] = -pv_flo[0]
99 1 akiss
100 1 akiss
# check the transversal direction
101 1 akiss
if pv_flo[1][0]<0 :
102 1 akiss
        pv_flo[1] = -pv_flo[1]
103 1 akiss
104 1 akiss
print("New pv_flo",pv_flo)
105 1 akiss
106 1 akiss
'''
107 1 akiss
pv_ref = [np.array([0,-1,0]),
108 1 akiss
np.array([-1,0,0])]
109 1 akiss

110 1 akiss
'''
111 1 akiss
pv_ref = [np.array([0,1,0]),
112 1 akiss
np.array([1,0,0])]
113 1 akiss
114 1 akiss
115 1 akiss
# compute superposing transformation
116 1 akiss
trsf_file=outputdir+imnameroot+'_rigid.txt'
117 1 akiss
write_superposing_transfo(pv_flo, pv_ref, sepale_centered, trsf_file)
118 1 akiss
119 4 akiss
trsf=tfread(trsf_file)
120 4 akiss
os.system("rm "+trsf_file)
121 4 akiss
122 1 akiss
# apply transformation
123 4 akiss
oriented=apply_transfo_on_seg1(trsf, sepale_centered)
124 1 akiss
125 1 akiss
# smooth the transformed image
126 4 akiss
#sepale = binary_closing(oriented, structure=struct_el, iterations=radius)
127 1 akiss
128 1 akiss
# and save the oriented sepal
129 4 akiss
sepale_filename = outputdir+imnameroot+'_oriented.inr.gz'
130 4 akiss
sepale=SpatialImage(oriented*255, dtype='uint8', voxelsize=voxelsize, origin=[0, 0, 0])
131 1 akiss
imsave(sepale_filename, sepale)