oct-to-tiff 0.5.0__py3-none-any.whl → 0.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oct_to_tiff/cli.py +121 -57
- {oct_to_tiff-0.5.0.dist-info → oct_to_tiff-0.6.1.dist-info}/METADATA +21 -48
- oct_to_tiff-0.6.1.dist-info/RECORD +7 -0
- {oct_to_tiff-0.5.0.dist-info → oct_to_tiff-0.6.1.dist-info}/WHEEL +1 -2
- {oct_to_tiff-0.5.0.dist-info → oct_to_tiff-0.6.1.dist-info}/entry_points.txt +1 -0
- oct_to_tiff-0.5.0.dist-info/RECORD +0 -8
- oct_to_tiff-0.5.0.dist-info/top_level.txt +0 -1
- {oct_to_tiff-0.5.0.dist-info → oct_to_tiff-0.6.1.dist-info/licenses}/LICENSE.txt +0 -0
oct_to_tiff/cli.py
CHANGED
|
@@ -6,24 +6,25 @@ from typing import Any
|
|
|
6
6
|
|
|
7
7
|
import defusedxml.ElementTree as DET
|
|
8
8
|
import numpy as np
|
|
9
|
+
import numpy.typing as npt
|
|
9
10
|
import tifffile
|
|
10
|
-
from
|
|
11
|
+
from roifile import ROI_TYPE, ImagejRoi, roiwrite
|
|
11
12
|
|
|
12
13
|
logger = logging.getLogger(__name__)
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
def reshape_volume(
|
|
16
|
-
volume: NDArray[Any],
|
|
17
|
+
volume: npt.NDArray[Any],
|
|
17
18
|
frames_per_data_group: int,
|
|
18
19
|
total_data_groups: int,
|
|
19
20
|
oct_window_height: int,
|
|
20
21
|
xy_scan_length: int,
|
|
21
|
-
) -> NDArray[Any]:
|
|
22
|
+
) -> npt.NDArray[Any]:
|
|
22
23
|
"""Reshape a 1-dimensional array to a 3-dimensional array.
|
|
23
24
|
|
|
24
25
|
Parameters
|
|
25
26
|
----------
|
|
26
|
-
volume : NDArray[Any]
|
|
27
|
+
volume : npt.NDArray[Any]
|
|
27
28
|
A 1-dimensional array.
|
|
28
29
|
frames_per_data_group : int
|
|
29
30
|
The number of frames per data group.
|
|
@@ -36,7 +37,7 @@ def reshape_volume(
|
|
|
36
37
|
|
|
37
38
|
Returns
|
|
38
39
|
-------
|
|
39
|
-
volume : NDArray[Any]
|
|
40
|
+
volume : npt.NDArray[Any]
|
|
40
41
|
A 3-dimensional array.
|
|
41
42
|
|
|
42
43
|
"""
|
|
@@ -51,32 +52,47 @@ def reshape_volume(
|
|
|
51
52
|
return volume
|
|
52
53
|
|
|
53
54
|
|
|
54
|
-
def
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
def volume_metadata(
|
|
56
|
+
pixel_size_x: float | None,
|
|
57
|
+
pixel_size_y: float | None,
|
|
58
|
+
pixel_size_z: float | None,
|
|
59
|
+
) -> dict[str, Any]:
|
|
60
|
+
"""Build a dictionary of metadata.
|
|
58
61
|
|
|
59
62
|
Parameters
|
|
60
63
|
----------
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
pixel_size_x : float | None
|
|
65
|
+
The pixel (voxel) width in mm.
|
|
66
|
+
pixel_size_y : float | None
|
|
67
|
+
The pixel (voxel) height in mm.
|
|
68
|
+
pixel_size_z : float | None
|
|
69
|
+
The pixel (voxel) depth in mm.
|
|
63
70
|
|
|
64
71
|
Returns
|
|
65
72
|
-------
|
|
66
|
-
|
|
67
|
-
A
|
|
73
|
+
metadata : dict[str, Any]
|
|
74
|
+
A dictionary of metadata.
|
|
68
75
|
|
|
69
76
|
"""
|
|
70
|
-
|
|
71
|
-
|
|
77
|
+
metadata: dict[str, Any] = {"axes": "ZYX"}
|
|
78
|
+
if pixel_size_x is not None:
|
|
79
|
+
metadata["PhysicalSizeX"] = pixel_size_x
|
|
80
|
+
metadata["PhysicalSizeXUnit"] = "mm"
|
|
81
|
+
if pixel_size_y is not None:
|
|
82
|
+
metadata["PhysicalSizeY"] = pixel_size_y
|
|
83
|
+
metadata["PhysicalSizeYUnit"] = "mm"
|
|
84
|
+
if pixel_size_z is not None:
|
|
85
|
+
metadata["PhysicalSizeZ"] = pixel_size_z
|
|
86
|
+
metadata["PhysicalSizeZUnit"] = "mm"
|
|
87
|
+
return metadata
|
|
72
88
|
|
|
73
89
|
|
|
74
90
|
def write_volume(
|
|
75
91
|
output_path: Path,
|
|
76
|
-
volume: NDArray[Any],
|
|
77
|
-
pixel_size_x: float,
|
|
78
|
-
pixel_size_y: float,
|
|
79
|
-
pixel_size_z: float,
|
|
92
|
+
volume: npt.NDArray[Any],
|
|
93
|
+
pixel_size_x: float | None,
|
|
94
|
+
pixel_size_y: float | None,
|
|
95
|
+
pixel_size_z: float | None,
|
|
80
96
|
) -> None:
|
|
81
97
|
"""Write a 3-dimensional array to the output path as an OME-TIFF file, including voxel size in the metadata.
|
|
82
98
|
|
|
@@ -84,7 +100,7 @@ def write_volume(
|
|
|
84
100
|
----------
|
|
85
101
|
output_path : Path
|
|
86
102
|
The specified output path.
|
|
87
|
-
volume : NDArray[Any]
|
|
103
|
+
volume : npt.NDArray[Any]
|
|
88
104
|
A 3-dimensional array.
|
|
89
105
|
pixel_size_x : float
|
|
90
106
|
The pixel (voxel) width in mm.
|
|
@@ -98,19 +114,11 @@ def write_volume(
|
|
|
98
114
|
output_path,
|
|
99
115
|
volume,
|
|
100
116
|
photometric="minisblack",
|
|
101
|
-
metadata=
|
|
102
|
-
"axes": "ZYX",
|
|
103
|
-
"PhysicalSizeX": pixel_size_x,
|
|
104
|
-
"PhysicalSizeXUnit": "mm",
|
|
105
|
-
"PhysicalSizeY": pixel_size_y,
|
|
106
|
-
"PhysicalSizeYUnit": "mm",
|
|
107
|
-
"PhysicalSizeZ": pixel_size_z,
|
|
108
|
-
"PhysicalSizeZUnit": "mm",
|
|
109
|
-
},
|
|
117
|
+
metadata=volume_metadata(pixel_size_x, pixel_size_y, pixel_size_z),
|
|
110
118
|
)
|
|
111
119
|
|
|
112
120
|
|
|
113
|
-
def
|
|
121
|
+
def boundaries_to_arrays(input_path: str | Path) -> list[npt.NDArray[np.int_]]:
|
|
114
122
|
"""Extract segmentation lines.
|
|
115
123
|
|
|
116
124
|
Parameters
|
|
@@ -118,6 +126,10 @@ def extract_boundaries(input_path: str | Path) -> None:
|
|
|
118
126
|
input_path : str | Path
|
|
119
127
|
The specified input path.
|
|
120
128
|
|
|
129
|
+
Returns
|
|
130
|
+
-------
|
|
131
|
+
arrays : list[npt.NDArray[np.int_]]
|
|
132
|
+
A list of 2-dimensional arrays.
|
|
121
133
|
"""
|
|
122
134
|
input_path = Path(input_path)
|
|
123
135
|
tree = DET.parse(input_path)
|
|
@@ -128,14 +140,36 @@ def extract_boundaries(input_path: str | Path) -> None:
|
|
|
128
140
|
int(point.text) if point.text else 0
|
|
129
141
|
for point in root.findall("./Curve_Set/Image/Curve/D")
|
|
130
142
|
]
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
143
|
+
num_arrays = len(data_points) // array_size
|
|
144
|
+
|
|
145
|
+
arrays = []
|
|
146
|
+
for i in range(num_arrays):
|
|
134
147
|
start = i * array_size
|
|
135
148
|
end = start + array_size
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
149
|
+
array = np.column_stack([np.arange(array_size), data_points[start:end]])
|
|
150
|
+
arrays.append(array)
|
|
151
|
+
|
|
152
|
+
return arrays
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def arrays_to_rois(arrays: list[npt.NDArray[np.int_]], output_path: Path) -> None:
|
|
156
|
+
"""
|
|
157
|
+
Convert a list of 2-dimensional arrays to ImageJ ROIs (ZIP file).
|
|
158
|
+
|
|
159
|
+
Parameters
|
|
160
|
+
----------
|
|
161
|
+
arrays : list[npt.NDArray[np.int_]]
|
|
162
|
+
A list of 2-dimensional arrays.
|
|
163
|
+
output_path : Path
|
|
164
|
+
The specified output path.
|
|
165
|
+
"""
|
|
166
|
+
rois = []
|
|
167
|
+
for array in arrays:
|
|
168
|
+
roi = ImagejRoi.frompoints(array)
|
|
169
|
+
roi.roitype = ROI_TYPE(4) # FREELINE
|
|
170
|
+
rois.append(roi)
|
|
171
|
+
|
|
172
|
+
roiwrite(output_path, rois, mode="w")
|
|
139
173
|
|
|
140
174
|
|
|
141
175
|
def main() -> None:
|
|
@@ -202,18 +236,22 @@ def main() -> None:
|
|
|
202
236
|
else:
|
|
203
237
|
dir_name = input_path.parent
|
|
204
238
|
file_name = input_path.stem
|
|
205
|
-
|
|
239
|
+
if args.boundaries:
|
|
240
|
+
file_extension = "_rois.zip"
|
|
241
|
+
else:
|
|
242
|
+
file_extension = ".ome.tif"
|
|
206
243
|
output_path = dir_name / (file_name + file_extension)
|
|
207
244
|
|
|
208
245
|
if Path.is_file(output_path):
|
|
209
246
|
if args.overwrite:
|
|
210
|
-
|
|
247
|
+
logger.warning(f"Overwriting {output_path}")
|
|
211
248
|
else:
|
|
212
249
|
logger.error(f"{output_path} already exists.")
|
|
213
250
|
return
|
|
214
251
|
|
|
215
252
|
if args.boundaries:
|
|
216
|
-
|
|
253
|
+
arrays = boundaries_to_arrays(input_path)
|
|
254
|
+
arrays_to_rois(arrays, output_path)
|
|
217
255
|
return
|
|
218
256
|
|
|
219
257
|
with open(input_path, "rb") as f:
|
|
@@ -234,7 +272,7 @@ def main() -> None:
|
|
|
234
272
|
xy_scan_length = int(len(volume) ** 0.5)
|
|
235
273
|
pixel_size_x = args.size / oct_window_height
|
|
236
274
|
pixel_size_y = args.size / xy_scan_length
|
|
237
|
-
pixel_size_z =
|
|
275
|
+
pixel_size_z = None
|
|
238
276
|
elif args.seg_curve:
|
|
239
277
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
240
278
|
if len(volume) == 1280000 or len(volume) == 1120000:
|
|
@@ -245,9 +283,9 @@ def main() -> None:
|
|
|
245
283
|
oct_window_height = 304
|
|
246
284
|
total_data_groups = 1
|
|
247
285
|
xy_scan_length = len(volume) // (frames_per_data_group * oct_window_height)
|
|
248
|
-
pixel_size_x =
|
|
249
|
-
pixel_size_y =
|
|
250
|
-
pixel_size_z =
|
|
286
|
+
pixel_size_x = None
|
|
287
|
+
pixel_size_y = None
|
|
288
|
+
pixel_size_z = None
|
|
251
289
|
elif "3D Cornea" in file_name:
|
|
252
290
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
253
291
|
frames_per_data_group = 106
|
|
@@ -257,6 +295,32 @@ def main() -> None:
|
|
|
257
295
|
pixel_size_x = 0.007797
|
|
258
296
|
pixel_size_y = 0.003071
|
|
259
297
|
pixel_size_z = 0.040000
|
|
298
|
+
|
|
299
|
+
volume = reshape_volume(
|
|
300
|
+
volume,
|
|
301
|
+
frames_per_data_group,
|
|
302
|
+
total_data_groups,
|
|
303
|
+
oct_window_height,
|
|
304
|
+
xy_scan_length,
|
|
305
|
+
)
|
|
306
|
+
volume = np.rot90(volume, k=1, axes=(1, 2))
|
|
307
|
+
volume_main = volume[:101]
|
|
308
|
+
volume_align = volume[101:frames_per_data_group]
|
|
309
|
+
align_path = dir_name / (file_name + "_Align.ome.tif")
|
|
310
|
+
pixel_size_x_align = 0.003899
|
|
311
|
+
pixel_size_y_align = 0.003071
|
|
312
|
+
pixel_size_z_align = 0.040000
|
|
313
|
+
write_volume(
|
|
314
|
+
output_path, volume_main, pixel_size_x, pixel_size_y, pixel_size_z
|
|
315
|
+
)
|
|
316
|
+
write_volume(
|
|
317
|
+
align_path,
|
|
318
|
+
volume_align,
|
|
319
|
+
pixel_size_x_align,
|
|
320
|
+
pixel_size_y_align,
|
|
321
|
+
pixel_size_z_align,
|
|
322
|
+
)
|
|
323
|
+
return
|
|
260
324
|
elif "3D Disc" in file_name:
|
|
261
325
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
262
326
|
frames_per_data_group = 106
|
|
@@ -301,7 +365,7 @@ def main() -> None:
|
|
|
301
365
|
xy_scan_length = 1020
|
|
302
366
|
pixel_size_x = 0.002941
|
|
303
367
|
pixel_size_y = 0.003071
|
|
304
|
-
pixel_size_z =
|
|
368
|
+
pixel_size_z = None
|
|
305
369
|
elif "Cornea Cross Line" in file_name:
|
|
306
370
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
307
371
|
frames_per_data_group = 2
|
|
@@ -310,7 +374,7 @@ def main() -> None:
|
|
|
310
374
|
xy_scan_length = 941
|
|
311
375
|
pixel_size_x = 0.008502
|
|
312
376
|
pixel_size_y = 0.003071
|
|
313
|
-
pixel_size_z =
|
|
377
|
+
pixel_size_z = None
|
|
314
378
|
elif "Cornea Line" in file_name:
|
|
315
379
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
316
380
|
frames_per_data_group = 1
|
|
@@ -319,7 +383,7 @@ def main() -> None:
|
|
|
319
383
|
xy_scan_length = 1020
|
|
320
384
|
pixel_size_x = 0.007843
|
|
321
385
|
pixel_size_y = 0.003071
|
|
322
|
-
pixel_size_z =
|
|
386
|
+
pixel_size_z = None
|
|
323
387
|
elif "Cross Line" in file_name:
|
|
324
388
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
325
389
|
frames_per_data_group = 2
|
|
@@ -328,7 +392,7 @@ def main() -> None:
|
|
|
328
392
|
xy_scan_length = 1020
|
|
329
393
|
pixel_size_x = 0.009804
|
|
330
394
|
pixel_size_y = 0.003071
|
|
331
|
-
pixel_size_z =
|
|
395
|
+
pixel_size_z = None
|
|
332
396
|
elif "Enhanced HD Line" in file_name:
|
|
333
397
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
334
398
|
frames_per_data_group = 1
|
|
@@ -337,7 +401,7 @@ def main() -> None:
|
|
|
337
401
|
xy_scan_length = 998
|
|
338
402
|
pixel_size_x = 0.012024
|
|
339
403
|
pixel_size_y = 0.003071
|
|
340
|
-
pixel_size_z =
|
|
404
|
+
pixel_size_z = None
|
|
341
405
|
elif "GCC" in file_name:
|
|
342
406
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
343
407
|
frames_per_data_group = 16
|
|
@@ -346,7 +410,7 @@ def main() -> None:
|
|
|
346
410
|
xy_scan_length = 933
|
|
347
411
|
pixel_size_x = 0.007503
|
|
348
412
|
pixel_size_y = 0.003071
|
|
349
|
-
pixel_size_z =
|
|
413
|
+
pixel_size_z = None
|
|
350
414
|
elif "Grid" in file_name:
|
|
351
415
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
352
416
|
frames_per_data_group = 10
|
|
@@ -355,7 +419,7 @@ def main() -> None:
|
|
|
355
419
|
xy_scan_length = 1020
|
|
356
420
|
pixel_size_x = 0.005882
|
|
357
421
|
pixel_size_y = 0.003071
|
|
358
|
-
pixel_size_z =
|
|
422
|
+
pixel_size_z = None
|
|
359
423
|
elif "HD Angio Disc" in file_name:
|
|
360
424
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
361
425
|
frames_per_data_group = 400
|
|
@@ -409,7 +473,7 @@ def main() -> None:
|
|
|
409
473
|
xy_scan_length = 1024
|
|
410
474
|
pixel_size_x = 0.009766
|
|
411
475
|
pixel_size_y = 0.003071
|
|
412
|
-
pixel_size_z =
|
|
476
|
+
pixel_size_z = None
|
|
413
477
|
elif "Line" in file_name:
|
|
414
478
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
415
479
|
frames_per_data_group = 1
|
|
@@ -418,7 +482,7 @@ def main() -> None:
|
|
|
418
482
|
xy_scan_length = 1020
|
|
419
483
|
pixel_size_x = 0.008824
|
|
420
484
|
pixel_size_y = 0.003071
|
|
421
|
-
pixel_size_z =
|
|
485
|
+
pixel_size_z = None
|
|
422
486
|
elif "ONH" in file_name:
|
|
423
487
|
volume = np.frombuffer(f.read(), dtype=np.single, count=2223360)
|
|
424
488
|
frames_per_data_group = 3
|
|
@@ -427,7 +491,7 @@ def main() -> None:
|
|
|
427
491
|
xy_scan_length = 965
|
|
428
492
|
pixel_size_x = 0.015952
|
|
429
493
|
pixel_size_y = 0.003071
|
|
430
|
-
pixel_size_z =
|
|
494
|
+
pixel_size_z = None
|
|
431
495
|
elif "PachymetryWide" in file_name:
|
|
432
496
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
433
497
|
frames_per_data_group = 16
|
|
@@ -436,7 +500,7 @@ def main() -> None:
|
|
|
436
500
|
xy_scan_length = 1536
|
|
437
501
|
pixel_size_x = 0.005859
|
|
438
502
|
pixel_size_y = 0.003071
|
|
439
|
-
pixel_size_z =
|
|
503
|
+
pixel_size_z = None
|
|
440
504
|
elif "Raster" in file_name:
|
|
441
505
|
volume = np.frombuffer(f.read(), dtype=np.single)
|
|
442
506
|
frames_per_data_group = 21
|
|
@@ -445,7 +509,7 @@ def main() -> None:
|
|
|
445
509
|
xy_scan_length = 1020
|
|
446
510
|
pixel_size_x = 0.011765
|
|
447
511
|
pixel_size_y = 0.003071
|
|
448
|
-
pixel_size_z =
|
|
512
|
+
pixel_size_z = None
|
|
449
513
|
elif "Retina Map" in file_name:
|
|
450
514
|
volume = np.frombuffer(f.read(), dtype=np.single, count=6680960)
|
|
451
515
|
frames_per_data_group = 13
|
|
@@ -454,7 +518,7 @@ def main() -> None:
|
|
|
454
518
|
xy_scan_length = 803
|
|
455
519
|
pixel_size_x = 0.007472
|
|
456
520
|
pixel_size_y = 0.003071
|
|
457
|
-
pixel_size_z =
|
|
521
|
+
pixel_size_z = None
|
|
458
522
|
|
|
459
523
|
volume = reshape_volume(
|
|
460
524
|
volume,
|
|
@@ -465,7 +529,7 @@ def main() -> None:
|
|
|
465
529
|
)
|
|
466
530
|
|
|
467
531
|
if not args.en_face and not args.seg_curve:
|
|
468
|
-
volume =
|
|
532
|
+
volume = np.rot90(volume, k=1, axes=(1, 2))
|
|
469
533
|
|
|
470
534
|
write_volume(output_path, volume, pixel_size_x, pixel_size_y, pixel_size_z)
|
|
471
535
|
|
|
@@ -1,63 +1,36 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: oct-to-tiff
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.1
|
|
4
4
|
Summary: A command line tool for converting optical coherence tomography angiography (OCTA) data.
|
|
5
|
-
Author-email: Cameron Lloyd <lloyd@med.unideb.hu>
|
|
6
|
-
Maintainer-email: Cameron Lloyd <lloyd@med.unideb.hu>
|
|
7
|
-
License: BSD 3-Clause License
|
|
8
|
-
|
|
9
|
-
Copyright (c) 2021, Cameron Lloyd
|
|
10
|
-
All rights reserved.
|
|
11
|
-
|
|
12
|
-
Redistribution and use in source and binary forms, with or without
|
|
13
|
-
modification, are permitted provided that the following conditions are met:
|
|
14
|
-
|
|
15
|
-
1. Redistributions of source code must retain the above copyright notice, this
|
|
16
|
-
list of conditions and the following disclaimer.
|
|
17
|
-
|
|
18
|
-
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
19
|
-
this list of conditions and the following disclaimer in the documentation
|
|
20
|
-
and/or other materials provided with the distribution.
|
|
21
|
-
|
|
22
|
-
3. Neither the name of the copyright holder nor the names of its
|
|
23
|
-
contributors may be used to endorse or promote products derived from
|
|
24
|
-
this software without specific prior written permission.
|
|
25
|
-
|
|
26
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
27
|
-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
28
|
-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
29
|
-
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
30
|
-
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
31
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
32
|
-
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
33
|
-
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
34
|
-
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
35
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
36
|
-
|
|
37
|
-
Project-URL: Homepage, https://github.com/camlloyd/oct-to-tiff
|
|
38
|
-
Project-URL: Bug Tracker, https://github.com/camlloyd/oct-to-tiff/issues
|
|
39
|
-
Project-URL: Changelog, https://github.com/camlloyd/oct-to-tiff/blob/main/CHANGELOG.md
|
|
40
5
|
Keywords: angiography,cli,oct,octa
|
|
6
|
+
Author: Cameron Lloyd
|
|
7
|
+
Author-email: Cameron Lloyd <lloyd@med.unideb.hu>
|
|
8
|
+
License-Expression: BSD-3-Clause
|
|
9
|
+
License-File: LICENSE.txt
|
|
41
10
|
Classifier: Development Status :: 3 - Alpha
|
|
42
11
|
Classifier: Intended Audience :: Science/Research
|
|
43
|
-
Classifier: License :: OSI Approved :: BSD License
|
|
44
12
|
Classifier: Natural Language :: English
|
|
45
13
|
Classifier: Operating System :: OS Independent
|
|
46
14
|
Classifier: Programming Language :: Python :: 3
|
|
47
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
48
15
|
Classifier: Programming Language :: Python :: 3.11
|
|
49
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
50
17
|
Classifier: Programming Language :: Python :: 3.13
|
|
51
|
-
|
|
52
|
-
Description-Content-Type: text/markdown
|
|
53
|
-
License-File: LICENSE.txt
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
54
19
|
Requires-Dist: defusedxml
|
|
55
20
|
Requires-Dist: numpy
|
|
21
|
+
Requires-Dist: roifile
|
|
56
22
|
Requires-Dist: tifffile
|
|
23
|
+
Requires-Dist: mypy ; extra == 'dev'
|
|
24
|
+
Requires-Dist: ruff ; extra == 'dev'
|
|
25
|
+
Requires-Dist: types-defusedxml ; extra == 'dev'
|
|
26
|
+
Maintainer: Cameron Lloyd
|
|
27
|
+
Maintainer-email: Cameron Lloyd <lloyd@med.unideb.hu>
|
|
28
|
+
Requires-Python: >=3.11
|
|
29
|
+
Project-URL: Homepage, https://github.com/camlloyd/oct-to-tiff
|
|
30
|
+
Project-URL: Bug Tracker, https://github.com/camlloyd/oct-to-tiff/issues
|
|
31
|
+
Project-URL: Changelog, https://github.com/camlloyd/oct-to-tiff/blob/main/CHANGELOG.md
|
|
57
32
|
Provides-Extra: dev
|
|
58
|
-
|
|
59
|
-
Requires-Dist: ruff; extra == "dev"
|
|
60
|
-
Requires-Dist: types-defusedxml; extra == "dev"
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
61
34
|
|
|
62
35
|
# oct-to-tiff
|
|
63
36
|
|
|
@@ -74,9 +47,9 @@ via pip:
|
|
|
74
47
|
|
|
75
48
|
pip install oct-to-tiff
|
|
76
49
|
|
|
77
|
-
via
|
|
50
|
+
via conda:
|
|
78
51
|
|
|
79
|
-
|
|
52
|
+
conda install conda-forge::oct-to-tiff
|
|
80
53
|
|
|
81
54
|
## Getting started
|
|
82
55
|
oct-to-tiff /path/to/image.OCT
|
|
@@ -214,4 +187,4 @@ This project uses [Ruff](https://github.com/astral-sh/ruff) for linting and form
|
|
|
214
187
|
|
|
215
188
|
## Requirements
|
|
216
189
|
|
|
217
|
-
Requires Python 3.
|
|
190
|
+
Requires Python 3.11 or higher.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
oct_to_tiff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
oct_to_tiff/cli.py,sha256=zocMW8eg3CG1Xx_gLHac8Qxb1jY4TFlSaVMJFhFK1gU,18047
|
|
3
|
+
oct_to_tiff-0.6.1.dist-info/licenses/LICENSE.txt,sha256=8KO0dluzLStmIF0HM18BOP9T2miIcX8q-GOfMOw6Ngk,1521
|
|
4
|
+
oct_to_tiff-0.6.1.dist-info/WHEEL,sha256=5DEXXimM34_d4Gx1AuF9ysMr1_maoEtGKjaILM3s4w4,80
|
|
5
|
+
oct_to_tiff-0.6.1.dist-info/entry_points.txt,sha256=7kgVLpDuqbX5H38msz7NjYjUXQzmk4PW0TXc_FRz2uA,54
|
|
6
|
+
oct_to_tiff-0.6.1.dist-info/METADATA,sha256=9OtspNGKdjnlwP5Pe2CpYRbzqyS91y5gbT0CgcaeymU,4939
|
|
7
|
+
oct_to_tiff-0.6.1.dist-info/RECORD,,
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
oct_to_tiff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
oct_to_tiff/cli.py,sha256=tHRUNBff0TTTtc0pnecF_t5mLWyoGG0kNKNVopyL4Sw,15934
|
|
3
|
-
oct_to_tiff-0.5.0.dist-info/LICENSE.txt,sha256=8KO0dluzLStmIF0HM18BOP9T2miIcX8q-GOfMOw6Ngk,1521
|
|
4
|
-
oct_to_tiff-0.5.0.dist-info/METADATA,sha256=8-nIJ6Pg_vvfxovcjIHgax-D1nMQaWYZ_9cJLT7lq2g,6649
|
|
5
|
-
oct_to_tiff-0.5.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
6
|
-
oct_to_tiff-0.5.0.dist-info/entry_points.txt,sha256=mKWNdkTThZm2JKtLwp4PGMpXkvAWk-xnQDAOyRsCo9Y,53
|
|
7
|
-
oct_to_tiff-0.5.0.dist-info/top_level.txt,sha256=_ovqm7f48yb_IAiVqWzB3VPnHXwzkkEqQQ_ZJz_McSY,12
|
|
8
|
-
oct_to_tiff-0.5.0.dist-info/RECORD,,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
oct_to_tiff
|
|
File without changes
|