Révision 3
Fibril_Tool_Batch.ijm (revision 3)  

1 
////////////////////////////////////////////////////////////////////////////////// 

2 
///////////////////////Automation of FibrilTool macro///////////////////////////// 

3 
////////////////////////Marion Louveaux, PhD student////////////////////////////// 

4 
////////////////////////////////////////////////////////////////////////////////// 

5  
6 
//This macro is an automated version of FibrilTool macro, developped by Arezki Boudaoud (see 2014, Boudaoud, Nature Protocols) 

7 
//Put .png and RoiSet.zip in a unique directory (as much as you want) = "dir" 

8 
// .png and RoiSet.zip must share the same name: ImgName.png and ImgName_RoiSet.zip 

9 
//One RoiSet.zip = one .png 

10 
//FibrilTool is executed on each .roi of the RoiSet 

11 
//Results, raw data (new RoiSet) and Flattened images are saved in dir 

12  
13  
14  
15 
macro "Fibril Tool  C059L11eeL14beL41ebL178eL71e8L1a5eLa1e5" { 

16  
17 
dir = getDirectory("Choisir un repertoire de Projections") 

18  
19 
///Ask the user about fibril tool parameters 

20 
Dialog.create("Fibril Tool"); 

21 
Dialog.addMessage("Choose the channel\n(Red/Green/Blue)"); 

22 
Dialog.addChoice("Channel for fibrils?\t", newArray("G", "R", "B")); 

23 
Dialog.addChoice("Channel for drawing\t", newArray( "R", "G", "B")); 

24 
Dialog.addNumber("Multiply linelength by\t", 1); 

25 
Dialog.show(); 

26 
fib = Dialog.getChoice(); 

27 
drw = Dialog.getChoice(); 

28 
norm_constant = Dialog.getNumber(); // scaling factor for drawing of segments 

29  
30  
31 
///compute MTs orientation for each projection of the directory 

32 
list = getFileList(dir); 

33  
34  
35 
for (j=0; j<list.length; j++){ 

36 
//print("entree dans la boucle 2"); 

37 
if(endsWith (list[j], "png")){ 

38 
//print("path_fichier",dir+list[j]); 

39 
open( dir+File.separator+list[j] ); 

40 
nom2=substring(list[j],0,indexOf(list[j],".png")); 

41 
open( dir+File.separator+nom2+"_RoiSet.zip" ); 

42 


43 
//print("nom_fichier_tif",nom2); 

44  
45  
46 
// the log output gives the average properties of the region 

47 
// 0) image title 

48 
// cell number 

49 
// 1) xcoordinate of region centroid (scaled) 

50 
// ycoordinate of region centroid (scaled) 

51 
// area (scaled) 

52 
// 2) nematic tensor 

53 
// average orientation (angle in 90:90 in degrees) 

54 
// quality of the orientation (score between 0 and 1) 

55 
// The results are drawn on an overlay 

56 
// 3) coordinates of polygon vertices for record 

57  
58  
59 
// numbering of cells 

60 
var num; 

61  
62 
var pi = 3.14159265; 

63  
64  
65 
// 

66  
67 
id = getImageID(); 

68 
title = getTitle(); 

69  
70 
getPixelSize(unit,pixelWidth,pixelHeight); 

71 
if (pixelWidth != pixelHeight) exit("Rectangular pixels!"); 

72 
scale = pixelWidth; 

73  
74 
//setBatchMode(true); 

75  
76 
//properties of selection 

77 
num++ ; 

78 
selectImage(id); 

79  
80 
///ROI selection 

81 
n = roiManager("count"); 

82 
for (cell=0; cell<n; cell++) { 

83 
roiManager("select", cell); 

84  
85 
getSelectionCoordinates(vertx, verty); 

86 
c = polygonCentre(vertx,verty); 

87 
c0s = c[0]*scale ; 

88 
c1s = c[1]*scale ; 

89 
getRawStatistics(area); 

90 
areas = area*scale*scale; 

91 
pr = 2; 

92 
sortie = title+"\t"+cell; 

93 
sortie = sortie+"\t"+d2s(c0s,pr)+"\t"+d2s(c1s,pr)+"\t"+d2s(areas,pr); 

94  
95 
//extract fibril signal 

96 
selectImage(id); 

97 
run("Duplicate...", "title=Temp"); 

98 
run("Crop"); 

99 
getSelectionCoordinates(vertxloc, vertyloc); 

100 
if (fib == "R") setRGBWeights(1,0,0); 

101 
else if (fib == "G") setRGBWeights(0,1,0); 

102 
else if (fib =="B") setRGBWeights(0,0,1); 

103 
else exit("Fibril color undefined"); 

104 
run("8bit"); 

105  
106  
107 
//compute xgradient in "x" 

108 
selectWindow("Temp"); 

109 
run("Duplicate...","title=x"); 

110 
run("32bit"); 

111 
run("Translate...", "x=0.5 y=0 interpolation=Bicubic"); 

112 
run ("Duplicate...","title=x1"); 

113 
run("Translate...", "x=1 y=0 interpolation=None"); 

114 
imageCalculator("substract","x","x1"); 

115 
selectWindow("x1"); 

116 
close(); 

117  
118 
//compute ygradient in "y" 

119 
selectWindow("Temp"); 

120 
run ("Duplicate...","title=y"); 

121 
run("32bit"); 

122 
run("Translate...", "x=0 y=0.5 interpolation=Bicubic"); 

123 
run ("Duplicate...","title=y1"); 

124 
run("Translate...", "x=0 y=1 interpolation=None"); 

125 
imageCalculator("substract","y","y1"); 

126 
selectWindow("y1"); 

127 
close(); 

128  
129  
130 
//compute norm of gradient in "g" 

131 
selectWindow("x"); 

132 
run("Duplicate...","title=g"); 

133 
imageCalculator("multiply","g","x"); 

134 
selectWindow("y"); 

135 
run("Duplicate...","title=gp"); 

136 
imageCalculator("multiply","gp","y"); 

137 
imageCalculator("add","g","gp"); 

138 
selectWindow("gp"); 

139 
close(); 

140 
selectWindow("g"); 

141 
w = getWidth(); h = getHeight(); 

142 
for (y=0; y<h; y++) { 

143 
for (x=0; x<w; x++){ 

144 
setPixel(x, y, sqrt( getPixel(x, y))); 

145 
} 

146 
} 

147 
//set the effect of the gradient to 1/255 when too low ; threshold = 2 

148 
selectWindow("g"); 

149 
for (y=0; y<h; y++) { 

150 
for (x=0; x<w; x++){ 

151 
if (getPixel(x,y) < 2) 

152 
setPixel(x, y, 255); 

153 
} 

154 
} 

155  
156 
//normalize "x" and "y" to components of normal 

157 
imageCalculator("divide","x","g"); 

158 
imageCalculator("divide","y","g"); 

159  
160  
161 
//compute nxx 

162 
selectWindow("x"); 

163 
run("Duplicate...","title=nxx"); 

164 
imageCalculator("multiply","nxx","x"); 

165 
//compute nxy 

166 
selectWindow("x"); 

167 
run("Duplicate...","title=nxy"); 

168 
imageCalculator("multiply","nxy","y"); 

169 
//compute nyy 

170 
selectWindow("y"); 

171 
run("Duplicate...","title=nyy"); 

172 
imageCalculator("multiply","nyy","y"); 

173  
174 
//closing 

175 
selectWindow("Temp"); 

176 
close(); 

177 
selectWindow("x"); 

178 
close(); 

179 
selectWindow("y"); 

180 
close(); 

181 
selectWindow("g"); 

182 
close(); 

183  
184 
//averaging nematic tensor 

185 
selectWindow("nxx"); 

186 
makeSelection("polygon",vertxloc,vertyloc); 

187 
getRawStatistics(area,xx); 

188 
selectWindow("nxx"); 

189 
close(); 

190  
191 
selectWindow("nxy"); 

192 
makeSelection("polygon",vertxloc,vertyloc); 

193 
getRawStatistics(area,xy); 

194 
selectWindow("nxy"); 

195 
close(); 

196  
197 
selectWindow("nyy"); 

198 
makeSelection("polygon",vertxloc,vertyloc); 

199 
getRawStatistics(area,yy); 

200 
selectWindow("nyy"); 

201 
close(); 

202  
203 
//eigenvalues and eigenvector of texture tensor 

204 
m = (xx + yy) / 2; 

205 
d = (xx  yy) / 2; 

206 
v1 = m + sqrt(xy*xy + d*d); 

207 
v2 = m  sqrt(xy*xy + d*d); 

208 
//direction 

209 
tn =  atan((v2  xx) / xy); 

210 
//score 

211 
scoren = abs((v1v2) / 2 / m); 

212  
213 
//output 

214 
tsn=tn*180/pi; 

215 
// nematic tensor tensor 

216 
sortie = sortie+"\t"+d2s(tsn,pr)+"\t"+d2s(scoren,2*pr); 

217  
218 
//polygon coordinates 

219 
np = vertx.length; 

220 
for (i=0; i<np; i++){ 

221 
xp = vertx[i]; yp = verty[i]; 

222 
sortie = sortie+"\t"+d2s(xp,pr)+"\t"+d2s(yp,pr); 

223 
} 

224  
225  
226  
227 
// 

228 
//print output 

229 
print(sortie); 

230  
231  
232 
// 

233 
//drawing of directions and cell contour 

234 
setBatchMode(false); 

235 
selectImage(id); 

236 
run("Add Selection...", "stroke=yellow width=1"); 

237  
238  
239 
// drawing nematic tensor 

240 
if ( drw != "No" ) { 

241 
u1 = norm_constant*sqrt(area)*cos(tn)*scoren + c[0]; 

242 
v1 =  norm_constant*sqrt(area)*sin(tn)*scoren + c[1]; 

243 
u2 =  norm_constant*sqrt(area)*cos(tn)*scoren + c[0]; 

244 
v2 = norm_constant*sqrt(area)*sin(tn)*scoren + c[1]; 

245 
if (drw == "R") stroke = "red"; 

246 
else if (drw == "G") stroke = "green"; 

247 
else if (drw =="B") stroke = "blue"; 

248 
else exit("Drawing color undefined"); 

249 
makeLine(u1,v1,u2,v2); 

250 
run("Add Selection...", "stroke="+stroke+" width=5"); 

251 
} 

252  
253  
254 
//print number at center 

255 
selectImage(id); 

256 
//makeText(num,c[0],c[1]); 

257 
run("Add Selection...", "stroke="+stroke+" font=15 fill=none"); 

258  
259  
260 
//restore original selection 

261 
makeSelection("polygon",vertx,verty); 

262  
263 
setTool("polygon"); 

264  
265  
266 
} //end of ROI selection 

267  
268 
selectWindow("ROI Manager"); 

269 
run("Close"); //fermer le roi manager 

270 
run("To ROI Manager"); 

271 
roiManager("Save", dir+File.separator+nom2+"_RoiSet_MTs_contour.zip" ); 

272 
roiManager("Show None"); 

273 
roiManager("Show all without labels"); //OU roiManager("Show All"); 

274  
275 
//Identification of ROI of cell contour 

276 
N = roiManager("count"); 

277 
a1 = newArray(N/3); 

278 
for (i=0; i<a1.length; i++){ 

279 
a1[i] = i*3; 

280 
} 

281  
282 
//Check indices of selected ROI 

283 
//printArray(a1); 

284  
285  
286 
//Delete ROI 

287 
roiManager("select", a1); 

288 
roiManager("Delete"); 

289  
290 
//Sauver les orientations des MTs 

291 
roiManager("Save", dir+File.separator+nom2+"_RoiSet_MTs.zip" ); 

292 
roiManager("Show all without labels"); 

293 
run("Flatten"); //projeter les MTs sur le .png 

294 
saveAs("Tiff", dir+File.separator+nom2+"_MTs.tif" ); 

295 
run("Close"); //fermer le .tif 

296  
297 
newImage("Untitled", "RGB black", 1024, 1024, 1); //projeter les MTs sur fond noir 

298 
roiManager("Show None"); 

299 
roiManager("Show all without labels"); //OU roiManager("Show All"); 

300 
run("Flatten"); 

301 
saveAs("Tiff", dir+File.separator+nom2+"_MTs_blackBG.tif" ); 

302 
close(); 

303 
close(); 

304 
close(); 

305 
selectWindow("ROI Manager"); 

306 
run("Close"); 

307  
308 
selectWindow("Log"); 

309 
saveAs("text", dir+File.separator+nom2+"_Log.txt" ); 

310 
run("Close"); 

311  
312 
} //end of if endswith .png 

313  
314  
315  
316 
//print("done"); 

317  
318 
} // end of for Projections 

319  
320  
321  
322  
323 
// centroid of a polygon 

324 
function polygonCentre(x,y){ 

325 
n =x.length; 

326 
area1 = 0; 

327 
xc = 0; yc = 0; 

328 
for (i=1; i<n; i++){ 

329 
inc = x[i1]*y[i]  x[i]*y[i1]; 

330 
area1 += inc; 

331 
xc += (x[i1]+x[i])*inc; 

332 
yc += (y[i1]+y[i])*inc; 

333 
} 

334 
inc = x[n1]*y[0]  x[0]*y[n1]; 

335 
area1 += inc; 

336 
xc += (x[n1]+x[0])*inc; 

337 
yc += (y[n1]+y[0])*inc; 

338 
area1 *= 3; 

339 
xc /= area1; 

340 
yc /= area1; 

341 
return newArray(xc,yc); 

342 
} 

343  
344  
345  
346 
//distance between two points (x1,y1) et (x2,y2) 

347 
function distance(x1,y1,x2,y2) { 

348 
return sqrt((x1x2)*(x1x2)+(y1y2)*(y1y2)); 

349 
} 

350  
351  
352 
function printArray(a) { 

353 
print(""); 

354 
for (i=0; i<a.length; i++) 

355 
print(i+": "+a[i]); 

356 
} 

357  
358  
359 
Formats disponibles : Unified diff