Statistiques
| Révision :

root / bin / image2geometry / measure_sepal.py @ 16

Historique | Voir | Annoter | Télécharger (4,54 ko)

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

7 1 akiss
- filename = path and name of the stack file containing the object (background=0)
8 1 akiss
the object is supposed already oriented as follows:
9 1 akiss
- output = output directory
10 1 akiss
---------------------------------------------------------------------------------
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
Output:
16 1 akiss

17 1 akiss
measured data is written into the file output.csv
18 1 akiss
flat projections are written in the output directory
19 1 akiss

20 1 akiss
'''
21 1 akiss
22 1 akiss
from sys import argv
23 1 akiss
import os
24 1 akiss
import numpy as np
25 1 akiss
from scipy.ndimage.morphology import binary_closing, binary_opening
26 1 akiss
27 1 akiss
from titk_tools.io import imread, imsave
28 1 akiss
from bib_sepals import *
29 1 akiss
30 1 akiss
31 1 akiss
print('============== measure_sepal.py =================')
32 1 akiss
33 1 akiss
filename = argv[1]
34 1 akiss
outdir = argv[2]
35 4 akiss
36 1 akiss
outputfile=outdir+"/"+outdir+".csv"
37 1 akiss
38 4 akiss
outputdir=outdir+"/sections/"
39 4 akiss
projectiondir=outdir+"/projections"
40 1 akiss
41 10 akiss
42 1 akiss
print(argv)
43 1 akiss
44 1 akiss
imname = filename.split('/')[-1]
45 1 akiss
imnameroot = imname.split('.')[0]
46 1 akiss
47 4 akiss
projected2Dimage=projectiondir+"/"+imnameroot+"2D.png"
48 4 akiss
#projected2Dimage_hight=outdir+"/hight_"+imnameroot+"2D.png"
49 1 akiss
50 1 akiss
os.system("mkdir -p "+outputdir)
51 1 akiss
52 12 akiss
53 16 akiss
54 1 akiss
outname = outputfile.split('/')[-1]
55 1 akiss
outroot = outname.split('.')[0]
56 1 akiss
57 1 akiss
print("----------------------")
58 1 akiss
print("reading the file ", filename)
59 1 akiss
print("----------------------")
60 1 akiss
sepale=imread(filename)
61 1 akiss
voxelsize = sepale.voxelsize
62 1 akiss
print("voxelsize=",voxelsize)
63 1 akiss
s = sepale.shape
64 10 akiss
imtype=sepale.dtype
65 1 akiss
print("shape=",s)
66 1 akiss
67 6 akiss
print("Computing the volume and volumic asymmetry...")
68 6 akiss
vol=len(np.where(sepale)[0])
69 6 akiss
70 6 akiss
# left-right symmetry
71 6 akiss
sep_left=sepale[:int(s[0]/2), :, :]
72 6 akiss
sep_right=sepale[int(s[0]/2):, :, :]
73 6 akiss
vol_left=len(np.where(sep_left)[0])
74 6 akiss
vol_right=len(np.where(sep_right)[0])
75 6 akiss
Avolx=(vol_left-vol_right+0.0)/(vol+0.0)
76 6 akiss
77 6 akiss
# top-base symmetry
78 6 akiss
sep_left=sepale[:, :int(s[1]/2), :]
79 6 akiss
sep_right=sepale[:, int(s[1]/2):, :]
80 6 akiss
vol_left=len(np.where(sep_left)[0])
81 6 akiss
vol_right=len(np.where(sep_right)[0])
82 6 akiss
Avoly=(vol_left-vol_right+0.0)/(vol+0.0)
83 6 akiss
84 6 akiss
vol=vol*voxelsize[0]*voxelsize[1]*voxelsize[2]
85 6 akiss
86 10 akiss
87 10 akiss
88 1 akiss
print("Projecting on 2D...")
89 1 akiss
90 1 akiss
def project2D(im3):
91 1 akiss
        s2=(s[1],s[0])
92 1 akiss
        im2=np.zeros(s2, dtype='uint8')
93 1 akiss
        for i in range(s[0]):
94 1 akiss
                im2[:,i]=np.array([max(im3[i,j,:]) for j in range(s[1])])
95 1 akiss
        return im2
96 1 akiss
97 1 akiss
def project2D_hightmap(im3):
98 1 akiss
        s2=(s[1],s[0])
99 1 akiss
        im2=np.zeros(s2, dtype='uint8')
100 1 akiss
        for i in range(s[0]):
101 1 akiss
                im2[:,i]=np.array([list(im3[i,j,:]).index(max(im3[i,j,:])) for j in range(s[1])])
102 1 akiss
        return im2
103 1 akiss
104 1 akiss
105 1 akiss
sepale2D=project2D(sepale)
106 1 akiss
imsave2D(projected2Dimage, sepale2D)
107 1 akiss
108 1 akiss
'''
109 1 akiss
sepale2D=project2D_hightmap(sepale)
110 1 akiss
imsave2D(projected2Dimage_hight, sepale2D)
111 1 akiss
'''
112 1 akiss
113 6 akiss
114 1 akiss
print('Extracting principal section curves...')
115 1 akiss
116 1 akiss
# longitudinal section
117 1 akiss
x_section = sepale[int(s[0]/2), :, :]
118 1 akiss
xup_filename = outputdir+imnameroot+'_section_xup.txt'
119 1 akiss
xdown_filename = outputdir+imnameroot+'_section_xdown.txt'
120 1 akiss
x_filename = outputdir+imnameroot+'_section_x.txt'
121 1 akiss
x_pixelsize = (voxelsize[1],voxelsize[2])
122 1 akiss
xup, xdown = extract_curves(x_section)
123 1 akiss
124 1 akiss
write_curve(xup, x_pixelsize, xup_filename)
125 1 akiss
126 1 akiss
127 1 akiss
# transversal section
128 1 akiss
y_section = sepale[:,int(s[1]/2), :]
129 1 akiss
yup_filename = outputdir+imnameroot+'_section_yup.txt'
130 1 akiss
ydown_filename = outputdir+imnameroot+'_section_ydown.txt'
131 1 akiss
y_filename = outputdir+imnameroot+'_section_y.txt'
132 1 akiss
y_pixelsize = (voxelsize[0],voxelsize[2])
133 1 akiss
yup, ydown = extract_curves(y_section)
134 1 akiss
135 1 akiss
write_curve(yup, y_pixelsize, yup_filename)
136 1 akiss
137 1 akiss
138 1 akiss
#
139 1 akiss
# ----------------------------------------
140 1 akiss
print('Analyzing principal section curves...')
141 1 akiss
142 1 akiss
if not(os.path.isfile(outputfile)):
143 1 akiss
        FILE = open(outputfile,"w")
144 6 akiss
        FILE.write('Sepal;CurvedLength;FlatLength;LHeight;LR;LR21;LR22;LR41;LR423;LR44;CurvedWidth;FlatWidth;THeight;TR;TR21;TR22;TR41;TR423;TR44;volume;AsymL;AsymT\n')
145 1 akiss
        FILE.close()
146 1 akiss
147 1 akiss
FILE = open(outputfile,"a")
148 1 akiss
FILE.write(imnameroot+';')
149 1 akiss
150 12 akiss
print("Longitudinal section:")
151 1 akiss
outfile=outroot+'_up_longitudinal.csv'
152 1 akiss
graph_name= outputdir+imnameroot+'_up_longitudinal.png'
153 12 akiss
154 12 akiss
length_x, flatlength_x, height_x, R, R21, R22, R41, R423, R44=analyze_curve1(imnameroot, xup, x_pixelsize, outfile, "Longitudinal", graph_name)
155 4 akiss
os.system("rm "+outfile)
156 1 akiss
157 1 akiss
FILE.write(str(length_x)+';'+str(flatlength_x)+';'+str(height_x)+';'+str(R)+';'+str(R21)+';'+str(R22)+';'+str(R41)+';'+str(R423)+';'+str(R44)+';')
158 1 akiss
159 12 akiss
print("Transversal section:")
160 1 akiss
outfile=outroot+'_up_transversal.csv'
161 1 akiss
graph_name= outputdir+imnameroot+'_up_transversal.png'
162 12 akiss
length_y, flatlength_y, height_y, R, R21, R22, R41, R423, R44=analyze_curve1(imnameroot, yup, y_pixelsize, outfile, "Transversal", graph_name)
163 4 akiss
os.system("rm "+outfile)
164 1 akiss
165 6 akiss
FILE.write(str(length_y)+';'+str(flatlength_y)+';'+str(height_y)+';'+str(R)+';'+str(R21)+';'+str(R22)+';'+str(R41)+';'+str(R423)+';'+str(R44)+';')
166 1 akiss
167 6 akiss
FILE.write(str(vol)+';'+str(Avoly)+';'+str(Avolx)+'\n')