This notebook is part of the PyImageJ Tutorial Series, and assumes familiarity with the ImageJ API. Dedicated tutorials for ImageJ can be found here.

8 Discover ImageJ commands with the Recorder

The original ImageJ contains many useful commands that can be hard to use in PyImageJ without some prior knowledge on the their parameters. This notebook demonstrates how to use ImageJ’s Recorder feature to record ImageJ commands in a supported language (IJ Macro, BeanScript, Java and JavaScript).

8.1 Example 1: Apply “Find Maxima…” command to an image

In this example we will use “Find Maxima” on a test image. Once the image is loaded, open the Recorder (see image below) and begin running commands to capture the code lines.

Open macro recorder

Now that the Recorder window is open and listening for commands, set the recorder language to either Java or JavaScript before running the “Find Maxima…” command. Next run the “Find Maxima…” command (Process > Find Maxima…) to capture the code lines.

Macro recorder

Running “Find Maxima…” (set to prominence=1000 and Point Selection) on test_still.tif results in 21 detections which are then overlayed over the input image.:

Result

Now that we have the Java code for the “Find Maxima…” command we can replicate this workflow in PyImageJ. The “Find Maxima…” command will overlay detections ontop of a displayed input image, therefore we will need to initialize ImageJ in interactive mode. Please note that MacOS users will have to change the mode to gui due to architecture limitations. For more information please visit the initialization documentation.

import imagej

# initialize ImageJ2
ij = imagej.init(mode='headless')
print(f"ImageJ2 version: {ij.getVersion()}")
ImageJ2 version: 2.9.0/1.53t

Because the “Find Maxima…” and other original ImageJ commands work with the ImagePlus object type (instead of the newer ImageJ2/ImgLib2 Dataset and ImgPlus object types) we need to first convert the Dataset returned from ij.io().open() to an ImagePlus.

Note: There is a currently a bug

# HACK: # HACK: Work around ImagePlus#show() failure if no ImagePlus objects are already registered.
if ij.WindowManager.getIDList() is None:
    ij.py.run_macro('newImage("dummy", "8-bit", 1, 1, 1);')
Operating in headless mode - the original ImageJ will have limited functionality.
Operating in headless mode - the WindowManager class will not be fully functional.
# open test image and convert from Dataset to ImagePlus
dataset = ij.io().open('sample-data/test_still.tif')
imp = ij.py.to_imageplus(dataset)

# show the image
ij.py.show(imp)
_images/daf32029fc6d9289fd60f1799ed881d058f652b74ae2771e40ce8028f9948c58.png

Next, show the image with ImageJ and run Find Maxima... using the same Java syntax generated from the recorder.

# show image and then find maxima
imp.getProcessor().resetMinAndMax()
ij.ui().show(imp)
ij.IJ.run(imp, "Find Maxima...", "prominence=1000 output=[Point Selection]")
[java.lang.Enum.toString] [INFO] null = img["test_still.tif" (-3), 16-bit, 300x300x1x1x1]
Operating in headless mode - the IJ class will not be fully functional.
[INFO] null = img["test_still.tif" (-3), 16-bit, 300x300x1x1x1]

8.2 Example 2: Extract a slice and run “Analyze Particles…”

Let’s try a more complicated example next. This Java code was generated with the ImageJ Recorder while analyzing some data.

imp = IJ.openImage("sample-data/test_timeseries.tif");
imp2 = new Duplicator().run(imp, 3, 3, 1, 1, 14, 14);
IJ.run(imp, "Enhance Contrast", "saturated=0.35");
IJ.setAutoThreshold(imp, "Moments dark");
IJ.run(imp, "Analyze Particles...", "  show=Overlay display clear");

The Java code takes the test_timeseries.tif sample data (4D: [X, Y, Channel, Time]) and performs the following operations:

  1. Open the test data.

  2. Duplicate channel 3, frame 14 (extracts a single still from the timeseries).

  3. Enhance the contrast of the image.

  4. Threshold with “Moments dark”.

  5. Analyze particles and display results via overlay.

Results:

Analyze Particles

Note that in this example we will use the orginal ImageJ’s image opener (IJ.openImage()) instead of ImageJ2’s (ij.io().open()). The original ImageJ’s opener is more limited than ImageJ2’s however it will return an ImagePlus image object instead of a Dataset, thus no conversion step is needed like in the previous example.

Just like in the Example 1 the Java code generated from the Recorder can be typically used with little to no modification for language syntax (take note of the different syntax needed to use the Duplicator):

from scyjava import jimport

# get ImageJ's duplicator
Duplicator = jimport('ij.plugin.Duplicator')

# run ImageJ commands
imp_timeseries = ij.IJ.openImage("sample-data/test_timeseries.tif")
imp_extract = Duplicator().run(imp_timeseries, 3, 3, 1, 1, 14, 14) # visit the Javadoc for more info https://imagej.nih.gov/ij/developer/api/ij/ij/plugin/Duplicator.html
ij.IJ.run(imp_extract, "Enhance Contrast", "saturated=0.35")
ij.ui().show(imp_extract)
ij.IJ.setAutoThreshold(imp_extract, "Moments dark")
ij.IJ.run(imp_extract, "Analyze Particles...", " show=Overlay display clear")
[INFO] null = img["DUP_test_timeseries.tif" (-6), 16-bit, 250x250x1x1x1]
[java.lang.Enum.toString] [INFO] null = img["DUP_test_timeseries.tif" (-6), 16-bit, 250x250x1x1x1]
 	Area	Mean	Min	Max
1	0.211	1293	1141	1445
2	0.739	1216.143	1085	1473
3	0.106	1333.000	1333	1333
4	0.528	1193.400	1099	1295
5	0.317	1241.667	1087	1384
6	180.091	1513.540	1083	4462
7	0.106	1104.000	1104	1104
8	3.803	1478.194	1085	2510
9	0.211	1268.000	1161	1375
10	0.211	1171.000	1108	1234
11	0.106	1257.000	1257	1257
12	0.423	1371.250	1186	1686
13	0.317	1140.667	1109	1157
14	0.423	1187.500	1097	1241
15	0.528	1182.800	1132	1312
16	0.423	1302.500	1117	1634
17	0.739	1215.286	1102	1352
18	0.423	1234.500	1192	1276
19	1.479	1192.214	1086	1398
20	0.845	1422.125	1150	1897
21	0.211	1116.500	1113	1120
22	0.211	1141.500	1128	1155
23	0.106	1168.000	1168	1168
24	0.106	1163.000	1163	1163
25	0.211	1126.000	1102	1150
26	0.423	1222.750	1086	1383
27	22.498	1762.784	1084	5446
28	1.162	1330.364	1092	1829
29	0.634	1167.667	1110	1227
30	0.739	1328.571	1137	1482
31	1.162	1216.818	1089	1455
32	0.106	1124.000	1124	1124
33	0.317	1166.333	1101	1208
34	0.106	1092.000	1092	1092
35	0.106	1136.000	1136	1136
36	0.211	1106.000	1092	1120
37	3.063	1362.310	1083	2069
38	0.106	1088.000	1088	1088
39	0.211	1150.500	1104	1197
40	0.211	1123.500	1110	1137
41	1.901	1434.944	1103	2129
42	0.211	1128.500	1100	1157
43	8.344	1414.139	1091	2321
44	0.951	1351.111	1134	1652
45	0.951	1435.444	1088	1798
46	0.528	1161.400	1106	1248
47	0.528	1120.200	1102	1144
48	0.528	1277.400	1110	1547
49	0.951	1182.667	1088	1279
50	0.211	1184.000	1110	1258
51	3.274	1360.774	1098	1866
52	0.423	1267.250	1116	1458
53	3.908	1232.703	1083	1597
54	11.302	1550.327	1096	2918
55	0.211	1088.500	1087	1090
56	0.106	1138.000	1138	1138
57	1.901	1470.667	1102	2386
58	0.106	1084.000	1084	1084
59	1.373	1266.846	1145	1573
60	2.113	1330.600	1131	1581
61	2.958	1209.321	1083	1670
62	1.056	1364.300	1106	1748
63	0.423	1334.500	1289	1374
64	0.106	1141.000	1141	1141
65	1.162	1330.818	1083	1694
66	0.423	1250.500	1131	1375
67	0.423	1182.250	1102	1337
68	0.211	1120.500	1120	1121
69	0.106	1097.000	1097	1097
70	25.561	1346.455	1084	2808
71	1.162	1133.455	1084	1221
72	6.338	1389.550	1113	2426
73	0.634	1148.333	1089	1231
74	1.796	1360.118	1084	1974
75	0.951	1351.000	1095	1746
76	0.106	1113.000	1113	1113
77	0.634	1129.167	1089	1212
78	0.106	1108.000	1108	1108
79	0.106	1090.000	1090	1090
80	0.106	1105.000	1105	1105
81	0.106	1138.000	1138	1138
82	1.584	1573.533	1103	2296
83	0.106	1108.000	1108	1108
84	0.211	1103.500	1085	1122
85	0.106	1092.000	1092	1092
86	0.211	1103.000	1084	1122
87	2.852	1268.963	1091	1598
88	0.423	1100.750	1083	1122
89	0.106	1110.000	1110	1110
90	0.317	1136.333	1102	1188
91	0.106	1126.000	1126	1126
92	0.106	1116.000	1116	1116
93	0.317	1141.667	1084	1233
94	0.106	1083.000	1083	1083
95	1.479	1183.571	1085	1314
96	0.211	1138.000	1135	1141
97	2.429	1494.130	1084	2113
98	0.211	1125.000	1102	1148
99	0.211	1098.500	1085	1112
100	0.423	1157.250	1100	1208
101	0.739	1273.714	1125	1414
102	0.634	1142.833	1096	1169
103	0.211	1127.500	1099	1156
104	0.739	1239.714	1095	1509
105	0.106	1091.000	1091	1091
106	0.845	1167.000	1084	1255
107	0.211	1085.000	1085	1085
108	1.479	1309.357	1097	1704
109	0.528	1316.600	1211	1587
110	0.951	1314.778	1133	1693
111	0.423	1148.250	1097	1244
112	0.423	1146.500	1103	1165
113	1.373	1357.538	1092	1626
114	0.106	1156.000	1156	1156
115	10.563	1473.170	1084	2716
116	0.211	1161.000	1156	1166
117	0.106	1095.000	1095	1095
118	0.106	1101.000	1101	1101
119	5.176	1373.796	1089	2209
120	0.317	1266.333	1203	1303
121	0.528	1288.200	1110	1490
122	2.113	1429.950	1098	2307
123	1.584	1249.067	1090	1491
124	2.007	1558.421	1099	2453
125	0.106	1112.000	1112	1112
126	1.056	1243.600	1085	1465
127	2.218	1518.762	1094	2666
128	0.211	1172.000	1159	1185
129	0.634	1275.167	1099	1602
130	0.106	1131.000	1131	1131
131	0.106	1277.000	1277	1277
132	0.106	1119.000	1119	1119
133	0.317	1191.000	1130	1236
134	0.106	1163.000	1163	1163
135	0.211	1141.500	1113	1170
136	0.106	1119.000	1119	1119
[java.lang.Enum.toString]  	Area	Mean	Min	Max[java.lang.Enum.toString] 
[java.lang.Enum.toString] 1	0.211	1293	1141	1445[java.lang.Enum.toString] 
[java.lang.Enum.toString] 2	0.739	1216.143	1085	1473[java.lang.Enum.toString] 
[java.lang.Enum.toString] 3	0.106	1333.000	1333	1333[java.lang.Enum.toString] 
[java.lang.Enum.toString] 4	0.528	1193.400	1099	1295[java.lang.Enum.toString] 
[java.lang.Enum.toString] 5	0.317	1241.667	1087	1384[java.lang.Enum.toString] 
[java.lang.Enum.toString] 6	180.091	1513.540	1083	4462[java.lang.Enum.toString] 
[java.lang.Enum.toString] 7	0.106	1104.000	1104	1104[java.lang.Enum.toString] 
[java.lang.Enum.toString] 8	3.803	1478.194	1085	2510[java.lang.Enum.toString] 
[java.lang.Enum.toString] 9	0.211	1268.000	1161	1375[java.lang.Enum.toString] 
[java.lang.Enum.toString] 10	0.211	1171.000	1108	1234[java.lang.Enum.toString] 
[java.lang.Enum.toString] 11	0.106	1257.000	1257	1257[java.lang.Enum.toString] 
[java.lang.Enum.toString] 12	0.423	1371.250	1186	1686[java.lang.Enum.toString] 
[java.lang.Enum.toString] 13	0.317	1140.667	1109	1157[java.lang.Enum.toString] 
[java.lang.Enum.toString] 14	0.423	1187.500	1097	1241[java.lang.Enum.toString] 
[java.lang.Enum.toString] 15	0.528	1182.800	1132	1312[java.lang.Enum.toString] 
[java.lang.Enum.toString] 16	0.423	1302.500	1117	1634[java.lang.Enum.toString] 
[java.lang.Enum.toString] 17	0.739	1215.286	1102	1352[java.lang.Enum.toString] 
[java.lang.Enum.toString] 18	0.423	1234.500	1192	1276[java.lang.Enum.toString] 
[java.lang.Enum.toString] 19	1.479	1192.214	1086	1398[java.lang.Enum.toString] 
[java.lang.Enum.toString] 20	0.845	1422.125	1150	1897[java.lang.Enum.toString] 
[java.lang.Enum.toString] 21	0.211	1116.500	1113	1120[java.lang.Enum.toString] 
[java.lang.Enum.toString] 22	0.211	1141.500	1128	1155[java.lang.Enum.toString] 
[java.lang.Enum.toString] 23	0.106	1168.000	1168	1168[java.lang.Enum.toString] 
[java.lang.Enum.toString] 24	0.106	1163.000	1163	1163[java.lang.Enum.toString] 
[java.lang.Enum.toString] 25	0.211	1126.000	1102	1150[java.lang.Enum.toString] 
[java.lang.Enum.toString] 26	0.423	1222.750	1086	1383[java.lang.Enum.toString] 
[java.lang.Enum.toString] 27	22.498	1762.784	1084	5446[java.lang.Enum.toString] 
[java.lang.Enum.toString] 28	1.162	1330.364	1092	1829[java.lang.Enum.toString] 
[java.lang.Enum.toString] 29	0.634	1167.667	1110	1227[java.lang.Enum.toString] 
[java.lang.Enum.toString] 30	0.739	1328.571	1137	1482[java.lang.Enum.toString] 
[java.lang.Enum.toString] 31	1.162	1216.818	1089	1455[java.lang.Enum.toString] 
[java.lang.Enum.toString] 32	0.106	1124.000	1124	1124[java.lang.Enum.toString] 
[java.lang.Enum.toString] 33	0.317	1166.333	1101	1208[java.lang.Enum.toString] 
[java.lang.Enum.toString] 34	0.106	1092.000	1092	1092[java.lang.Enum.toString] 
[java.lang.Enum.toString] 35	0.106	1136.000	1136	1136[java.lang.Enum.toString] 
[java.lang.Enum.toString] 36	0.211	1106.000	1092	1120[java.lang.Enum.toString] 
[java.lang.Enum.toString] 37	3.063	1362.310	1083	2069[java.lang.Enum.toString] 
[java.lang.Enum.toString] 38	0.106	1088.000	1088	1088[java.lang.Enum.toString] 
[java.lang.Enum.toString] 39	0.211	1150.500	1104	1197[java.lang.Enum.toString] 
[java.lang.Enum.toString] 40	0.211	1123.500	1110	1137[java.lang.Enum.toString] 
[java.lang.Enum.toString] 41	1.901	1434.944	1103	2129[java.lang.Enum.toString] 
[java.lang.Enum.toString] 42	0.211	1128.500	1100	1157[java.lang.Enum.toString] 
[java.lang.Enum.toString] 43	8.344	1414.139	1091	2321[java.lang.Enum.toString] 
[java.lang.Enum.toString] 44	0.951	1351.111	1134	1652[java.lang.Enum.toString] 
[java.lang.Enum.toString] 45	0.951	1435.444	1088	1798[java.lang.Enum.toString] 
[java.lang.Enum.toString] 46	0.528	1161.400	1106	1248[java.lang.Enum.toString] 
[java.lang.Enum.toString] 47	0.528	1120.200	1102	1144[java.lang.Enum.toString] 
[java.lang.Enum.toString] 48	0.528	1277.400	1110	1547[java.lang.Enum.toString] 
[java.lang.Enum.toString] 49	0.951	1182.667	1088	1279[java.lang.Enum.toString] 
[java.lang.Enum.toString] 50	0.211	1184.000	1110	1258[java.lang.Enum.toString] 
[java.lang.Enum.toString] 51	3.274	1360.774	1098	1866[java.lang.Enum.toString] 
[java.lang.Enum.toString] 52	0.423	1267.250	1116	1458[java.lang.Enum.toString] 
[java.lang.Enum.toString] 53	3.908	1232.703	1083	1597[java.lang.Enum.toString] 
[java.lang.Enum.toString] 54	11.302	1550.327	1096	2918[java.lang.Enum.toString] 
[java.lang.Enum.toString] 55	0.211	1088.500	1087	1090[java.lang.Enum.toString] 
[java.lang.Enum.toString] 56	0.106	1138.000	1138	1138[java.lang.Enum.toString] 
[java.lang.Enum.toString] 57	1.901	1470.667	1102	2386[java.lang.Enum.toString] 
[java.lang.Enum.toString] 58	0.106	1084.000	1084	1084[java.lang.Enum.toString] 
[java.lang.Enum.toString] 59	1.373	1266.846	1145	1573[java.lang.Enum.toString] 
[java.lang.Enum.toString] 60	2.113	1330.600	1131	1581[java.lang.Enum.toString] 
[java.lang.Enum.toString] 61	2.958	1209.321	1083	1670[java.lang.Enum.toString] 
[java.lang.Enum.toString] 62	1.056	1364.300	1106	1748[java.lang.Enum.toString] 
[java.lang.Enum.toString] 63	0.423	1334.500	1289	1374[java.lang.Enum.toString] 
[java.lang.Enum.toString] 64	0.106	1141.000	1141	1141[java.lang.Enum.toString] 
[java.lang.Enum.toString] 65	1.162	1330.818	1083	1694[java.lang.Enum.toString] 
[java.lang.Enum.toString] 66	0.423	1250.500	1131	1375[java.lang.Enum.toString] 
[java.lang.Enum.toString] 67	0.423	1182.250	1102	1337[java.lang.Enum.toString] 
[java.lang.Enum.toString] 68	0.211	1120.500	1120	1121[java.lang.Enum.toString] 
[java.lang.Enum.toString] 69	0.106	1097.000	1097	1097[java.lang.Enum.toString] 
[java.lang.Enum.toString] 70	25.561	1346.455	1084	2808[java.lang.Enum.toString] 
[java.lang.Enum.toString] 71	1.162	1133.455	1084	1221[java.lang.Enum.toString] 
[java.lang.Enum.toString] 72	6.338	1389.550	1113	2426[java.lang.Enum.toString] 
[java.lang.Enum.toString] 73	0.634	1148.333	1089	1231[java.lang.Enum.toString] 
[java.lang.Enum.toString] 74	1.796	1360.118	1084	1974[java.lang.Enum.toString] 
[java.lang.Enum.toString] 75	0.951	1351.000	1095	1746[java.lang.Enum.toString] 
[java.lang.Enum.toString] 76	0.106	1113.000	1113	1113[java.lang.Enum.toString] 
[java.lang.Enum.toString] 77	0.634	1129.167	1089	1212[java.lang.Enum.toString] 
[java.lang.Enum.toString] 78	0.106	1108.000	1108	1108[java.lang.Enum.toString] 
[java.lang.Enum.toString] 79	0.106	1090.000	1090	1090[java.lang.Enum.toString] 
[java.lang.Enum.toString] 80	0.106	1105.000	1105	1105[java.lang.Enum.toString] 
[java.lang.Enum.toString] 81	0.106	1138.000	1138	1138[java.lang.Enum.toString] 
[java.lang.Enum.toString] 82	1.584	1573.533	1103	2296[java.lang.Enum.toString] 
[java.lang.Enum.toString] 83	0.106	1108.000	1108	1108[java.lang.Enum.toString] 
[java.lang.Enum.toString] 84	0.211	1103.500	1085	1122[java.lang.Enum.toString] 
[java.lang.Enum.toString] 85	0.106	1092.000	1092	1092[java.lang.Enum.toString] 
[java.lang.Enum.toString] 86	0.211	1103.000	1084	1122[java.lang.Enum.toString] 
[java.lang.Enum.toString] 87	2.852	1268.963	1091	1598[java.lang.Enum.toString] 
[java.lang.Enum.toString] 88	0.423	1100.750	1083	1122[java.lang.Enum.toString] 
[java.lang.Enum.toString] 89	0.106	1110.000	1110	1110[java.lang.Enum.toString] 
[java.lang.Enum.toString] 90	0.317	1136.333	1102	1188[java.lang.Enum.toString] 
[java.lang.Enum.toString] 91	0.106	1126.000	1126	1126[java.lang.Enum.toString] 
[java.lang.Enum.toString] 92	0.106	1116.000	1116	1116[java.lang.Enum.toString] 
[java.lang.Enum.toString] 93	0.317	1141.667	1084	1233[java.lang.Enum.toString] 
[java.lang.Enum.toString] 94	0.106	1083.000	1083	1083[java.lang.Enum.toString] 
[java.lang.Enum.toString] 95	1.479	1183.571	1085	1314[java.lang.Enum.toString] 
[java.lang.Enum.toString] 96	0.211	1138.000	1135	1141[java.lang.Enum.toString] 
[java.lang.Enum.toString] 97	2.429	1494.130	1084	2113[java.lang.Enum.toString] 
[java.lang.Enum.toString] 98	0.211	1125.000	1102	1148[java.lang.Enum.toString] 
[java.lang.Enum.toString] 99	0.211	1098.500	1085	1112[java.lang.Enum.toString] 
[java.lang.Enum.toString] 100	0.423	1157.250	1100	1208[java.lang.Enum.toString] 
[java.lang.Enum.toString] 101	0.739	1273.714	1125	1414[java.lang.Enum.toString] 
[java.lang.Enum.toString] 102	0.634	1142.833	1096	1169[java.lang.Enum.toString] 
[java.lang.Enum.toString] 103	0.211	1127.500	1099	1156[java.lang.Enum.toString] 
[java.lang.Enum.toString] 104	0.739	1239.714	1095	1509[java.lang.Enum.toString] 
[java.lang.Enum.toString] 105	0.106	1091.000	1091	1091[java.lang.Enum.toString] 
[java.lang.Enum.toString] 106	0.845	1167.000	1084	1255[java.lang.Enum.toString] 
[java.lang.Enum.toString] 107	0.211	1085.000	1085	1085[java.lang.Enum.toString] 
[java.lang.Enum.toString] 108	1.479	1309.357	1097	1704[java.lang.Enum.toString] 
[java.lang.Enum.toString] 109	0.528	1316.600	1211	1587[java.lang.Enum.toString] 
[java.lang.Enum.toString] 110	0.951	1314.778	1133	1693[java.lang.Enum.toString] 
[java.lang.Enum.toString] 111	0.423	1148.250	1097	1244[java.lang.Enum.toString] 
[java.lang.Enum.toString] 112	0.423	1146.500	1103	1165[java.lang.Enum.toString] 
[java.lang.Enum.toString] 113	1.373	1357.538	1092	1626[java.lang.Enum.toString] 
[java.lang.Enum.toString] 114	0.106	1156.000	1156	1156[java.lang.Enum.toString] 
[java.lang.Enum.toString] 115	10.563	1473.170	1084	2716[java.lang.Enum.toString] 
[java.lang.Enum.toString] 116	0.211	1161.000	1156	1166[java.lang.Enum.toString] 
[java.lang.Enum.toString] 117	0.106	1095.000	1095	1095[java.lang.Enum.toString] 
[java.lang.Enum.toString] 118	0.106	1101.000	1101	1101[java.lang.Enum.toString] 
[java.lang.Enum.toString] 119	5.176	1373.796	1089	2209[java.lang.Enum.toString] 
[java.lang.Enum.toString] 120	0.317	1266.333	1203	1303[java.lang.Enum.toString] 
[java.lang.Enum.toString] 121	0.528	1288.200	1110	1490[java.lang.Enum.toString] 
[java.lang.Enum.toString] 122	2.113	1429.950	1098	2307[java.lang.Enum.toString] 
[java.lang.Enum.toString] 123	1.584	1249.067	1090	1491[java.lang.Enum.toString] 
[java.lang.Enum.toString] 124	2.007	1558.421	1099	2453[java.lang.Enum.toString] 
[java.lang.Enum.toString] 125	0.106	1112.000	1112	1112[java.lang.Enum.toString] 
[java.lang.Enum.toString] 126	1.056	1243.600	1085	1465[java.lang.Enum.toString] 
[java.lang.Enum.toString] 127	2.218	1518.762	1094	2666[java.lang.Enum.toString] 
[java.lang.Enum.toString] 128	0.211	1172.000	1159	1185[java.lang.Enum.toString] 
[java.lang.Enum.toString] 129	0.634	1275.167	1099	1602[java.lang.Enum.toString] 
[java.lang.Enum.toString] 130	0.106	1131.000	1131	1131[java.lang.Enum.toString] 
[java.lang.Enum.toString] 131	0.106	1277.000	1277	1277[java.lang.Enum.toString] 
[java.lang.Enum.toString] 132	0.106	1119.000	1119	1119[java.lang.Enum.toString] 
[java.lang.Enum.toString] 133	0.317	1191.000	1130	1236[java.lang.Enum.toString] 
[java.lang.Enum.toString] 134	0.106	1163.000	1163	1163[java.lang.Enum.toString] 
[java.lang.Enum.toString] 135	0.211	1141.500	1113	1170[java.lang.Enum.toString] 
[java.lang.Enum.toString] 136	0.106	1119.000	1119	1119[java.lang.Enum.toString] 

ImageJ macro language

It is possible to record workflows in the original ImageJ macro language and run those macros in PyImageJ with ij.py.run_macro() (see the07-Running-Macros-Scripts-and-Plugins notebook for more information). While this is functional, we do not recommend using the macro language as it is more fragile and less powerful due to the orignal ImageJ internal operations. For example, macros are single threaded only and do not take advantage of multi-threaded processing. For more information on ImageJ macro limitations please visit the macro wiki page.