large-image 1.30.2.dev10__tar.gz → 1.30.2.dev42__tar.gz
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.
- {large_image-1.30.2.dev10/large_image.egg-info → large_image-1.30.2.dev42}/PKG-INFO +76 -76
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/getting_started.rst +53 -6
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/notebooks/zarr_sink_example.ipynb +62 -29
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/base.py +53 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42/large_image.egg-info}/PKG-INFO +76 -76
- large_image-1.30.2.dev42/large_image.egg-info/requires.txt +151 -0
- large_image-1.30.2.dev10/large_image.egg-info/requires.txt +0 -151
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/LICENSE +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/NOTICE +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/README.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/annotations.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/api_index.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/caching.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/conf.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/config_options.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/development.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/dicomweb_assetstore.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/format_examples_datastore.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/formats.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/generate_format_table.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/girder_annotation_config_options.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/girder_caching.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/girder_config_options.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/girder_index.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/image_conversion.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/index.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/make_docs.sh +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/multi_source_specification.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/notebooks/large_image_examples.ipynb +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/notebooks.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/plottable.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/static/K.png +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/static/custom.css +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/tilesource_options.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/upgrade.rst +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/__init__.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/__init__.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/base.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/cache.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/cachefactory.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/memcache.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/rediscache.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/config.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/constants.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/exceptions.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/__init__.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/geo.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/jupyter.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/resample.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/stylefuncs.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/tiledict.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/tileiterator.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/utilities.py +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image.egg-info/SOURCES.txt +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image.egg-info/dependency_links.txt +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image.egg-info/not-zip-safe +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image.egg-info/top_level.txt +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/setup.cfg +0 -0
- {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: large-image
|
|
3
|
-
Version: 1.30.2.
|
|
3
|
+
Version: 1.30.2.dev42
|
|
4
4
|
Summary: Python modules to work with large, multiresolution images.
|
|
5
5
|
Home-page: https://github.com/girder/large_image
|
|
6
6
|
Author: Kitware, Inc.
|
|
@@ -30,7 +30,7 @@ Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "memcac
|
|
|
30
30
|
Provides-Extra: redis
|
|
31
31
|
Requires-Dist: redis>=4.5.5; extra == "redis"
|
|
32
32
|
Provides-Extra: converter
|
|
33
|
-
Requires-Dist: large-image-converter>=1.30.2.
|
|
33
|
+
Requires-Dist: large-image-converter>=1.30.2.dev42; extra == "converter"
|
|
34
34
|
Provides-Extra: colormaps
|
|
35
35
|
Requires-Dist: matplotlib; extra == "colormaps"
|
|
36
36
|
Provides-Extra: tiledoutput
|
|
@@ -39,105 +39,105 @@ Provides-Extra: performance
|
|
|
39
39
|
Requires-Dist: psutil>=4.2.0; extra == "performance"
|
|
40
40
|
Requires-Dist: simplejpeg; extra == "performance"
|
|
41
41
|
Provides-Extra: bioformats
|
|
42
|
-
Requires-Dist: large-image-source-bioformats>=1.30.2.
|
|
42
|
+
Requires-Dist: large-image-source-bioformats>=1.30.2.dev42; extra == "bioformats"
|
|
43
43
|
Provides-Extra: deepzoom
|
|
44
|
-
Requires-Dist: large-image-source-deepzoom>=1.30.2.
|
|
44
|
+
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev42; extra == "deepzoom"
|
|
45
45
|
Provides-Extra: dicom
|
|
46
|
-
Requires-Dist: large-image-source-dicom>=1.30.2.
|
|
46
|
+
Requires-Dist: large-image-source-dicom>=1.30.2.dev42; extra == "dicom"
|
|
47
47
|
Provides-Extra: dummy
|
|
48
|
-
Requires-Dist: large-image-source-dummy>=1.30.2.
|
|
48
|
+
Requires-Dist: large-image-source-dummy>=1.30.2.dev42; extra == "dummy"
|
|
49
49
|
Provides-Extra: gdal
|
|
50
|
-
Requires-Dist: large-image-source-gdal>=1.30.2.
|
|
50
|
+
Requires-Dist: large-image-source-gdal>=1.30.2.dev42; extra == "gdal"
|
|
51
51
|
Provides-Extra: mapnik
|
|
52
|
-
Requires-Dist: large-image-source-mapnik>=1.30.2.
|
|
52
|
+
Requires-Dist: large-image-source-mapnik>=1.30.2.dev42; extra == "mapnik"
|
|
53
53
|
Provides-Extra: multi
|
|
54
|
-
Requires-Dist: large-image-source-multi>=1.30.2.
|
|
54
|
+
Requires-Dist: large-image-source-multi>=1.30.2.dev42; extra == "multi"
|
|
55
55
|
Provides-Extra: nd2
|
|
56
|
-
Requires-Dist: large-image-source-nd2>=1.30.2.
|
|
56
|
+
Requires-Dist: large-image-source-nd2>=1.30.2.dev42; extra == "nd2"
|
|
57
57
|
Provides-Extra: ometiff
|
|
58
|
-
Requires-Dist: large-image-source-ometiff>=1.30.2.
|
|
58
|
+
Requires-Dist: large-image-source-ometiff>=1.30.2.dev42; extra == "ometiff"
|
|
59
59
|
Provides-Extra: openjpeg
|
|
60
|
-
Requires-Dist: large-image-source-openjpeg>=1.30.2.
|
|
60
|
+
Requires-Dist: large-image-source-openjpeg>=1.30.2.dev42; extra == "openjpeg"
|
|
61
61
|
Provides-Extra: openslide
|
|
62
|
-
Requires-Dist: large-image-source-openslide>=1.30.2.
|
|
62
|
+
Requires-Dist: large-image-source-openslide>=1.30.2.dev42; extra == "openslide"
|
|
63
63
|
Provides-Extra: pil
|
|
64
|
-
Requires-Dist: large-image-source-pil>=1.30.2.
|
|
64
|
+
Requires-Dist: large-image-source-pil>=1.30.2.dev42; extra == "pil"
|
|
65
65
|
Provides-Extra: rasterio
|
|
66
|
-
Requires-Dist: large-image-source-rasterio>=1.30.2.
|
|
66
|
+
Requires-Dist: large-image-source-rasterio>=1.30.2.dev42; extra == "rasterio"
|
|
67
67
|
Provides-Extra: test
|
|
68
|
-
Requires-Dist: large-image-source-test>=1.30.2.
|
|
68
|
+
Requires-Dist: large-image-source-test>=1.30.2.dev42; extra == "test"
|
|
69
69
|
Provides-Extra: tiff
|
|
70
|
-
Requires-Dist: large-image-source-tiff>=1.30.2.
|
|
70
|
+
Requires-Dist: large-image-source-tiff>=1.30.2.dev42; extra == "tiff"
|
|
71
71
|
Provides-Extra: tifffile
|
|
72
|
-
Requires-Dist: large-image-source-tifffile>=1.30.2.
|
|
72
|
+
Requires-Dist: large-image-source-tifffile>=1.30.2.dev42; extra == "tifffile"
|
|
73
73
|
Provides-Extra: vips
|
|
74
|
-
Requires-Dist: large-image-source-vips>=1.30.2.
|
|
74
|
+
Requires-Dist: large-image-source-vips>=1.30.2.dev42; extra == "vips"
|
|
75
75
|
Provides-Extra: zarr
|
|
76
|
-
Requires-Dist: large-image-source-zarr>=1.30.2.
|
|
76
|
+
Requires-Dist: large-image-source-zarr>=1.30.2.dev42; extra == "zarr"
|
|
77
77
|
Provides-Extra: sources
|
|
78
|
-
Requires-Dist: large-image-source-
|
|
79
|
-
Requires-Dist: large-image-source-
|
|
80
|
-
Requires-Dist: large-image-source-
|
|
81
|
-
Requires-Dist: large-image-source-
|
|
82
|
-
Requires-Dist: large-image-source-
|
|
83
|
-
Requires-Dist: large-image-source-
|
|
84
|
-
Requires-Dist: large-image-source-
|
|
85
|
-
Requires-Dist: large-image-source-
|
|
86
|
-
Requires-Dist: large-image-source-zarr>=1.30.2.
|
|
87
|
-
Requires-Dist: large-image-source-
|
|
88
|
-
Requires-Dist: large-image-source-
|
|
89
|
-
Requires-Dist: large-image-source-
|
|
90
|
-
Requires-Dist: large-image-source-
|
|
91
|
-
Requires-Dist: large-image-source-
|
|
92
|
-
Requires-Dist: large-image-source-
|
|
93
|
-
Requires-Dist: large-image-source-
|
|
94
|
-
Requires-Dist: large-image-source-
|
|
95
|
-
Requires-Dist: large-image-source-gdal>=1.30.2.
|
|
78
|
+
Requires-Dist: large-image-source-tifffile>=1.30.2.dev42; extra == "sources"
|
|
79
|
+
Requires-Dist: large-image-source-openjpeg>=1.30.2.dev42; extra == "sources"
|
|
80
|
+
Requires-Dist: large-image-source-test>=1.30.2.dev42; extra == "sources"
|
|
81
|
+
Requires-Dist: large-image-source-nd2>=1.30.2.dev42; extra == "sources"
|
|
82
|
+
Requires-Dist: large-image-source-tiff>=1.30.2.dev42; extra == "sources"
|
|
83
|
+
Requires-Dist: large-image-source-multi>=1.30.2.dev42; extra == "sources"
|
|
84
|
+
Requires-Dist: large-image-source-bioformats>=1.30.2.dev42; extra == "sources"
|
|
85
|
+
Requires-Dist: large-image-source-pil>=1.30.2.dev42; extra == "sources"
|
|
86
|
+
Requires-Dist: large-image-source-zarr>=1.30.2.dev42; extra == "sources"
|
|
87
|
+
Requires-Dist: large-image-source-dicom>=1.30.2.dev42; extra == "sources"
|
|
88
|
+
Requires-Dist: large-image-source-mapnik>=1.30.2.dev42; extra == "sources"
|
|
89
|
+
Requires-Dist: large-image-source-vips>=1.30.2.dev42; extra == "sources"
|
|
90
|
+
Requires-Dist: large-image-source-dummy>=1.30.2.dev42; extra == "sources"
|
|
91
|
+
Requires-Dist: large-image-source-rasterio>=1.30.2.dev42; extra == "sources"
|
|
92
|
+
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev42; extra == "sources"
|
|
93
|
+
Requires-Dist: large-image-source-ometiff>=1.30.2.dev42; extra == "sources"
|
|
94
|
+
Requires-Dist: large-image-source-openslide>=1.30.2.dev42; extra == "sources"
|
|
95
|
+
Requires-Dist: large-image-source-gdal>=1.30.2.dev42; extra == "sources"
|
|
96
96
|
Provides-Extra: all
|
|
97
|
-
Requires-Dist: large-image-source-
|
|
98
|
-
Requires-Dist:
|
|
99
|
-
Requires-Dist: large-image-source-
|
|
100
|
-
Requires-Dist: large-image-source-
|
|
101
|
-
Requires-Dist:
|
|
102
|
-
Requires-Dist: large-image-
|
|
103
|
-
Requires-Dist:
|
|
104
|
-
Requires-Dist: large-image-source-
|
|
105
|
-
Requires-Dist: large-image-source-
|
|
106
|
-
Requires-Dist:
|
|
107
|
-
Requires-Dist: large-image-source-
|
|
108
|
-
Requires-Dist: large-image-source-dicom>=1.30.2.dev10; extra == "all"
|
|
109
|
-
Requires-Dist: large-image-source-rasterio>=1.30.2.dev10; extra == "all"
|
|
110
|
-
Requires-Dist: large-image-source-test>=1.30.2.dev10; extra == "all"
|
|
111
|
-
Requires-Dist: large-image-source-pil[all]>=1.30.2.dev10; extra == "all"
|
|
112
|
-
Requires-Dist: large-image-source-tiff[all]>=1.30.2.dev10; extra == "all"
|
|
97
|
+
Requires-Dist: large-image-source-tifffile>=1.30.2.dev42; extra == "all"
|
|
98
|
+
Requires-Dist: large-image-source-openjpeg>=1.30.2.dev42; extra == "all"
|
|
99
|
+
Requires-Dist: large-image-source-tiff[all]>=1.30.2.dev42; extra == "all"
|
|
100
|
+
Requires-Dist: large-image-source-nd2>=1.30.2.dev42; extra == "all"
|
|
101
|
+
Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "all"
|
|
102
|
+
Requires-Dist: large-image-source-multi>=1.30.2.dev42; extra == "all"
|
|
103
|
+
Requires-Dist: large-image-source-bioformats>=1.30.2.dev42; extra == "all"
|
|
104
|
+
Requires-Dist: large-image-source-pil>=1.30.2.dev42; extra == "all"
|
|
105
|
+
Requires-Dist: large-image-source-zarr>=1.30.2.dev42; extra == "all"
|
|
106
|
+
Requires-Dist: large-image-source-mapnik>=1.30.2.dev42; extra == "all"
|
|
107
|
+
Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev42; extra == "all"
|
|
113
108
|
Requires-Dist: psutil>=4.2.0; extra == "all"
|
|
114
|
-
Requires-Dist: large-image-source-
|
|
115
|
-
Requires-Dist: large-image-source-
|
|
109
|
+
Requires-Dist: large-image-source-dummy>=1.30.2.dev42; extra == "all"
|
|
110
|
+
Requires-Dist: large-image-source-test>=1.30.2.dev42; extra == "all"
|
|
111
|
+
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev42; extra == "all"
|
|
112
|
+
Requires-Dist: large-image-source-rasterio>=1.30.2.dev42; extra == "all"
|
|
113
|
+
Requires-Dist: large-image-converter>=1.30.2.dev42; extra == "all"
|
|
114
|
+
Requires-Dist: large-image-source-ometiff>=1.30.2.dev42; extra == "all"
|
|
115
|
+
Requires-Dist: large-image-source-openslide>=1.30.2.dev42; extra == "all"
|
|
116
|
+
Requires-Dist: large-image-source-multi[all]>=1.30.2.dev42; extra == "all"
|
|
117
|
+
Requires-Dist: redis>=4.5.5; extra == "all"
|
|
118
|
+
Requires-Dist: large-image-source-pil[all]>=1.30.2.dev42; extra == "all"
|
|
119
|
+
Requires-Dist: large-image-source-tiff>=1.30.2.dev42; extra == "all"
|
|
116
120
|
Requires-Dist: pyvips; extra == "all"
|
|
117
|
-
Requires-Dist: large-image-source-
|
|
118
|
-
Requires-Dist:
|
|
119
|
-
Requires-Dist:
|
|
120
|
-
Requires-Dist:
|
|
121
|
-
Requires-Dist: large-image-source-
|
|
122
|
-
Requires-Dist: large-image-source-vips>=1.30.2.dev10; extra == "all"
|
|
123
|
-
Requires-Dist: large-image-source-mapnik>=1.30.2.dev10; extra == "all"
|
|
124
|
-
Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev10; extra == "all"
|
|
125
|
-
Requires-Dist: large-image-source-gdal>=1.30.2.dev10; extra == "all"
|
|
121
|
+
Requires-Dist: large-image-source-dicom>=1.30.2.dev42; extra == "all"
|
|
122
|
+
Requires-Dist: simplejpeg; extra == "all"
|
|
123
|
+
Requires-Dist: matplotlib; extra == "all"
|
|
124
|
+
Requires-Dist: large-image-source-vips>=1.30.2.dev42; extra == "all"
|
|
125
|
+
Requires-Dist: large-image-source-gdal>=1.30.2.dev42; extra == "all"
|
|
126
126
|
Provides-Extra: common
|
|
127
|
-
Requires-Dist:
|
|
128
|
-
Requires-Dist:
|
|
129
|
-
Requires-Dist: large-image-source-
|
|
127
|
+
Requires-Dist: redis>=4.5.5; extra == "common"
|
|
128
|
+
Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "common"
|
|
129
|
+
Requires-Dist: large-image-source-nd2>=1.30.2.dev42; extra == "common"
|
|
130
|
+
Requires-Dist: large-image-source-pil[all]>=1.30.2.dev42; extra == "common"
|
|
131
|
+
Requires-Dist: large-image-source-multi>=1.30.2.dev42; extra == "common"
|
|
132
|
+
Requires-Dist: large-image-source-zarr>=1.30.2.dev42; extra == "common"
|
|
133
|
+
Requires-Dist: large-image-source-dicom>=1.30.2.dev42; extra == "common"
|
|
130
134
|
Requires-Dist: simplejpeg; extra == "common"
|
|
131
|
-
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev10; extra == "common"
|
|
132
135
|
Requires-Dist: psutil>=4.2.0; extra == "common"
|
|
133
|
-
Requires-Dist: large-image-source-
|
|
136
|
+
Requires-Dist: large-image-source-test>=1.30.2.dev42; extra == "common"
|
|
134
137
|
Requires-Dist: matplotlib; extra == "common"
|
|
135
|
-
Requires-Dist:
|
|
136
|
-
Requires-Dist: large-image-source-
|
|
137
|
-
Requires-Dist:
|
|
138
|
-
Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev10; extra == "common"
|
|
139
|
-
Requires-Dist: large-image-source-tifffile>=1.30.2.dev10; extra == "common"
|
|
140
|
-
Requires-Dist: large-image-source-dicom>=1.30.2.dev10; extra == "common"
|
|
138
|
+
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev42; extra == "common"
|
|
139
|
+
Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev42; extra == "common"
|
|
140
|
+
Requires-Dist: large-image-source-tifffile>=1.30.2.dev42; extra == "common"
|
|
141
141
|
|
|
142
142
|
Large Image
|
|
143
143
|
===========
|
|
@@ -334,25 +334,60 @@ You can also composite a multi-frame image into a false-color output:
|
|
|
334
334
|
Writing an Image
|
|
335
335
|
----------------
|
|
336
336
|
|
|
337
|
-
If you wish to visualize numpy data, large_image can write a tiled
|
|
337
|
+
If you wish to visualize numpy data, ``large_image`` can write a tiled image.
|
|
338
|
+
This requires a tile source that supports writing to be installed.
|
|
339
|
+
As of this writing, the ``large-image-source-zarr`` and ``large-image-source-vips`` sources both support this.
|
|
340
|
+
If both are installed, the ``large-image-source-zarr`` is the default.
|
|
341
|
+
Some of the API options available for ``large-image-source-zarr`` are not available for ``large-image-source-vips``.
|
|
338
342
|
|
|
339
343
|
.. code-block:: python
|
|
340
344
|
|
|
341
345
|
import large_image
|
|
346
|
+
|
|
342
347
|
source = large_image.new()
|
|
343
348
|
for nparray, x, y in fancy_algorithm():
|
|
344
349
|
# We could optionally add a mask to limit the output
|
|
345
350
|
source.addTile(nparray, x, y)
|
|
346
351
|
source.write('/tmp/sample.tiff', lossy=False)
|
|
347
352
|
|
|
348
|
-
|
|
353
|
+
Multiple Frames
|
|
354
|
+
~~~~~~~~~~~~~~~
|
|
355
|
+
|
|
356
|
+
``large-image-source-zarr`` can be used to store multiframe data with arbitrary axes.
|
|
357
|
+
The example below demonstrates the creation of an image with five axes: T, Z, Y, X, S.
|
|
349
358
|
|
|
350
359
|
.. code-block:: python
|
|
351
360
|
|
|
352
361
|
import large_image
|
|
362
|
+
|
|
363
|
+
time_values = [0.5, 1.5, 2.5, 3.5]
|
|
364
|
+
z_values = [3, 6, 9]
|
|
365
|
+
tile_pos_values = [0, 1024, 2048, 3072, 4096]
|
|
366
|
+
|
|
353
367
|
source = large_image.new()
|
|
354
|
-
for
|
|
355
|
-
|
|
368
|
+
for t_index, t_value in enumerate(time_values):
|
|
369
|
+
for z_index, z_value in enumerate(z_values):
|
|
370
|
+
for y_value in tile_pos_values:
|
|
371
|
+
for x_value in tile_pos_values:
|
|
372
|
+
|
|
373
|
+
# tile is a numpy array with shape (1024, 1024, 3)
|
|
374
|
+
# this shape corresponds to the following axes, respectively: (Y, X, S)
|
|
375
|
+
tile = get_my_data_tile(x_value, y_value, z_value, t_value)
|
|
376
|
+
|
|
377
|
+
source.addTile(
|
|
378
|
+
tile,
|
|
379
|
+
x_value,
|
|
380
|
+
y_value,
|
|
381
|
+
z=z_index,
|
|
382
|
+
time=t_index,
|
|
383
|
+
|
|
384
|
+
# z_value and t_value are optional parameters to store the
|
|
385
|
+
# true values at the provided z index and t index
|
|
386
|
+
z_value=z_value,
|
|
387
|
+
time_value=t_value,
|
|
388
|
+
)
|
|
389
|
+
source.frameUnits = dict(t='ms', z='cm')
|
|
390
|
+
|
|
356
391
|
# The writer supports a variety of formats
|
|
357
392
|
source.write('/tmp/sample.zarr.zip', lossy=False)
|
|
358
393
|
|
|
@@ -361,31 +396,37 @@ You may also choose to read tiles from one source and write modified tiles to a
|
|
|
361
396
|
.. code-block:: python
|
|
362
397
|
|
|
363
398
|
import large_image
|
|
399
|
+
|
|
364
400
|
original_source = large_image.open('path/to/original/image.tiff')
|
|
365
401
|
new_source = large_image.new()
|
|
366
402
|
for frame in original_source.getMetadata().get('frames', []):
|
|
367
403
|
for tile in original_source.tileIterator(frame=frame['Frame'], format='numpy'):
|
|
368
|
-
|
|
404
|
+
tile_data, x, y = tile['tile'], tile['x'], tile['y']
|
|
369
405
|
kwargs = {
|
|
370
406
|
'z': frame['IndexZ'],
|
|
371
407
|
'c': frame['IndexC'],
|
|
372
408
|
}
|
|
373
|
-
modified_tile = modify_tile(
|
|
409
|
+
modified_tile = modify_tile(tile_data)
|
|
374
410
|
new_source.addTile(modified_tile, x=x, y=y, **kwargs)
|
|
375
411
|
new_source.write('path/to/new/image.tiff', lossy=False)
|
|
376
412
|
|
|
413
|
+
Multiple processes
|
|
414
|
+
~~~~~~~~~~~~~~~~~~
|
|
415
|
+
|
|
377
416
|
In some cases, it may be beneficial to write to a single image from multiple processes or threads:
|
|
378
417
|
|
|
379
418
|
.. code-block:: python
|
|
380
419
|
|
|
381
420
|
import large_image
|
|
382
421
|
import multiprocessing
|
|
422
|
+
|
|
383
423
|
# Important: Must be a pickleable function
|
|
384
424
|
def add_tile_to_source(tilesource, nparray, position):
|
|
385
425
|
tilesource.addTile(
|
|
386
426
|
nparray,
|
|
387
427
|
**position
|
|
388
428
|
)
|
|
429
|
+
|
|
389
430
|
source = large_image.new()
|
|
390
431
|
# Important: Maximum size must be allocated before any multiprocess concurrency
|
|
391
432
|
add_tile_to_source(source, np.zeros(1, 1, 3), dict(x=max_x, y=max_y, z=max_z))
|
|
@@ -397,4 +438,10 @@ In some cases, it may be beneficial to write to a single image from multiple pro
|
|
|
397
438
|
)
|
|
398
439
|
source.write('/tmp/sample.zarr.zip', lossy=False)
|
|
399
440
|
|
|
441
|
+
|
|
442
|
+
More examples
|
|
443
|
+
~~~~~~~~~~~~~
|
|
444
|
+
|
|
445
|
+
To see more examples of using ``large-image-source-zarr`` to write images, see :doc:`notebooks` and the `Zarr Sink Tests <https://github.com/girder/large_image/blob/master/test/test_sink.py>`_.
|
|
446
|
+
|
|
400
447
|
.. _Girder: https://girder.readthedocs.io/en/latest/
|
{large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/notebooks/zarr_sink_example.ipynb
RENAMED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"cell_type": "code",
|
|
25
|
-
"execution_count":
|
|
25
|
+
"execution_count": 1,
|
|
26
26
|
"id": "4ba28d02",
|
|
27
27
|
"metadata": {},
|
|
28
28
|
"outputs": [],
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"cell_type": "code",
|
|
40
|
-
"execution_count":
|
|
40
|
+
"execution_count": 2,
|
|
41
41
|
"id": "63c0c38f",
|
|
42
42
|
"metadata": {},
|
|
43
43
|
"outputs": [],
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
{
|
|
165
165
|
"data": {
|
|
166
166
|
"application/vnd.jupyter.widget-view+json": {
|
|
167
|
-
"model_id": "
|
|
167
|
+
"model_id": "97c6787b148c4b4f9639d623f32f8a3a",
|
|
168
168
|
"version_major": 2,
|
|
169
169
|
"version_minor": 0
|
|
170
170
|
},
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
},
|
|
192
192
|
{
|
|
193
193
|
"cell_type": "code",
|
|
194
|
-
"execution_count":
|
|
194
|
+
"execution_count": 7,
|
|
195
195
|
"id": "0e75e6de",
|
|
196
196
|
"metadata": {},
|
|
197
197
|
"outputs": [],
|
|
@@ -228,10 +228,22 @@
|
|
|
228
228
|
"data": {
|
|
229
229
|
"application/json": {
|
|
230
230
|
"IndexRange": {
|
|
231
|
-
"
|
|
231
|
+
"IndexFOOTPRINT": 3
|
|
232
232
|
},
|
|
233
233
|
"IndexStride": {
|
|
234
|
-
"
|
|
234
|
+
"IndexFOOTPRINT": 1
|
|
235
|
+
},
|
|
236
|
+
"ValueFOOTPRINT": {
|
|
237
|
+
"datatype": "int64",
|
|
238
|
+
"max": 50,
|
|
239
|
+
"min": 1,
|
|
240
|
+
"uniform": true,
|
|
241
|
+
"units": null,
|
|
242
|
+
"values": [
|
|
243
|
+
1,
|
|
244
|
+
10,
|
|
245
|
+
50
|
|
246
|
+
]
|
|
235
247
|
},
|
|
236
248
|
"bandCount": 3,
|
|
237
249
|
"channelmap": {
|
|
@@ -246,19 +258,22 @@
|
|
|
246
258
|
"Channel": "Band 1",
|
|
247
259
|
"Frame": 0,
|
|
248
260
|
"Index": 0,
|
|
249
|
-
"
|
|
261
|
+
"IndexFOOTPRINT": 0,
|
|
262
|
+
"ValueFOOTPRINT": 1
|
|
250
263
|
},
|
|
251
264
|
{
|
|
252
265
|
"Channel": "Band 1",
|
|
253
266
|
"Frame": 1,
|
|
254
267
|
"Index": 1,
|
|
255
|
-
"
|
|
268
|
+
"IndexFOOTPRINT": 1,
|
|
269
|
+
"ValueFOOTPRINT": 10
|
|
256
270
|
},
|
|
257
271
|
{
|
|
258
272
|
"Channel": "Band 1",
|
|
259
273
|
"Frame": 2,
|
|
260
274
|
"Index": 2,
|
|
261
|
-
"
|
|
275
|
+
"IndexFOOTPRINT": 2,
|
|
276
|
+
"ValueFOOTPRINT": 50
|
|
262
277
|
}
|
|
263
278
|
],
|
|
264
279
|
"levels": 6,
|
|
@@ -281,16 +296,34 @@
|
|
|
281
296
|
" 'mm_y': 0,\n",
|
|
282
297
|
" 'dtype': 'float64',\n",
|
|
283
298
|
" 'bandCount': 3,\n",
|
|
284
|
-
" 'frames': [{'Frame': 0
|
|
285
|
-
"
|
|
286
|
-
"
|
|
287
|
-
"
|
|
288
|
-
"
|
|
299
|
+
" 'frames': [{'Frame': 0,\n",
|
|
300
|
+
" 'IndexFOOTPRINT': 0,\n",
|
|
301
|
+
" 'ValueFOOTPRINT': 1,\n",
|
|
302
|
+
" 'Index': 0,\n",
|
|
303
|
+
" 'Channel': 'Band 1'},\n",
|
|
304
|
+
" {'Frame': 1,\n",
|
|
305
|
+
" 'IndexFOOTPRINT': 1,\n",
|
|
306
|
+
" 'ValueFOOTPRINT': 10,\n",
|
|
307
|
+
" 'Index': 1,\n",
|
|
308
|
+
" 'Channel': 'Band 1'},\n",
|
|
309
|
+
" {'Frame': 2,\n",
|
|
310
|
+
" 'IndexFOOTPRINT': 2,\n",
|
|
311
|
+
" 'ValueFOOTPRINT': 50,\n",
|
|
312
|
+
" 'Index': 2,\n",
|
|
313
|
+
" 'Channel': 'Band 1'}],\n",
|
|
314
|
+
" 'ValueFOOTPRINT': {'values': [1, 10, 50],\n",
|
|
315
|
+
" 'uniform': True,\n",
|
|
316
|
+
" 'units': None,\n",
|
|
317
|
+
" 'min': 1,\n",
|
|
318
|
+
" 'max': 50,\n",
|
|
319
|
+
" 'datatype': 'int64'},\n",
|
|
320
|
+
" 'IndexRange': {'IndexFOOTPRINT': 3},\n",
|
|
321
|
+
" 'IndexStride': {'IndexFOOTPRINT': 1},\n",
|
|
289
322
|
" 'channels': ['Band 1'],\n",
|
|
290
323
|
" 'channelmap': {'Band 1': 0}}"
|
|
291
324
|
]
|
|
292
325
|
},
|
|
293
|
-
"execution_count":
|
|
326
|
+
"execution_count": 8,
|
|
294
327
|
"metadata": {},
|
|
295
328
|
"output_type": "execute_result"
|
|
296
329
|
}
|
|
@@ -315,7 +348,7 @@
|
|
|
315
348
|
"\n",
|
|
316
349
|
" # add modified tile to sink\n",
|
|
317
350
|
" # specify tile x, tile y, and any arbitrary frame parameters\n",
|
|
318
|
-
" sink.addTile(processed_tile, x=tile['x'], y=tile['y'], i=
|
|
351
|
+
" sink.addTile(processed_tile, x=tile['x'], y=tile['y'], footprint=i, footprint_value=footprint_size)\n",
|
|
319
352
|
"# view metadata\n",
|
|
320
353
|
"sink.getMetadata()"
|
|
321
354
|
]
|
|
@@ -329,7 +362,7 @@
|
|
|
329
362
|
{
|
|
330
363
|
"data": {
|
|
331
364
|
"application/vnd.jupyter.widget-view+json": {
|
|
332
|
-
"model_id": "
|
|
365
|
+
"model_id": "fb60c2b967274a99a632f32f99389705",
|
|
333
366
|
"version_major": 2,
|
|
334
367
|
"version_minor": 0
|
|
335
368
|
},
|
|
@@ -398,10 +431,10 @@
|
|
|
398
431
|
"data": {
|
|
399
432
|
"application/json": {
|
|
400
433
|
"IndexRange": {
|
|
401
|
-
"
|
|
434
|
+
"IndexFOOTPRINT": 3
|
|
402
435
|
},
|
|
403
436
|
"IndexStride": {
|
|
404
|
-
"
|
|
437
|
+
"IndexFOOTPRINT": 1
|
|
405
438
|
},
|
|
406
439
|
"bandCount": 3,
|
|
407
440
|
"channelmap": {
|
|
@@ -416,19 +449,19 @@
|
|
|
416
449
|
"Channel": "Band 1",
|
|
417
450
|
"Frame": 0,
|
|
418
451
|
"Index": 0,
|
|
419
|
-
"
|
|
452
|
+
"IndexFOOTPRINT": 0
|
|
420
453
|
},
|
|
421
454
|
{
|
|
422
455
|
"Channel": "Band 1",
|
|
423
456
|
"Frame": 1,
|
|
424
457
|
"Index": 1,
|
|
425
|
-
"
|
|
458
|
+
"IndexFOOTPRINT": 1
|
|
426
459
|
},
|
|
427
460
|
{
|
|
428
461
|
"Channel": "Band 1",
|
|
429
462
|
"Frame": 2,
|
|
430
463
|
"Index": 2,
|
|
431
|
-
"
|
|
464
|
+
"IndexFOOTPRINT": 2
|
|
432
465
|
}
|
|
433
466
|
],
|
|
434
467
|
"levels": 4,
|
|
@@ -451,16 +484,16 @@
|
|
|
451
484
|
" 'mm_y': None,\n",
|
|
452
485
|
" 'dtype': 'uint16',\n",
|
|
453
486
|
" 'bandCount': 3,\n",
|
|
454
|
-
" 'frames': [{'Channel': 'Band 1', 'Frame': 0, 'Index': 0, '
|
|
455
|
-
" {'Channel': 'Band 1', 'Frame': 1, 'Index': 1, '
|
|
456
|
-
" {'Channel': 'Band 1', 'Frame': 2, 'Index': 2, '
|
|
457
|
-
" 'IndexRange': {'
|
|
458
|
-
" 'IndexStride': {'
|
|
487
|
+
" 'frames': [{'Channel': 'Band 1', 'Frame': 0, 'Index': 0, 'IndexFOOTPRINT': 0},\n",
|
|
488
|
+
" {'Channel': 'Band 1', 'Frame': 1, 'Index': 1, 'IndexFOOTPRINT': 1},\n",
|
|
489
|
+
" {'Channel': 'Band 1', 'Frame': 2, 'Index': 2, 'IndexFOOTPRINT': 2}],\n",
|
|
490
|
+
" 'IndexRange': {'IndexFOOTPRINT': 3},\n",
|
|
491
|
+
" 'IndexStride': {'IndexFOOTPRINT': 1},\n",
|
|
459
492
|
" 'channels': ['Band 1'],\n",
|
|
460
493
|
" 'channelmap': {'Band 1': 0}}"
|
|
461
494
|
]
|
|
462
495
|
},
|
|
463
|
-
"execution_count":
|
|
496
|
+
"execution_count": 11,
|
|
464
497
|
"metadata": {},
|
|
465
498
|
"output_type": "execute_result"
|
|
466
499
|
}
|
|
@@ -506,7 +539,7 @@
|
|
|
506
539
|
{
|
|
507
540
|
"data": {
|
|
508
541
|
"application/vnd.jupyter.widget-view+json": {
|
|
509
|
-
"model_id": "
|
|
542
|
+
"model_id": "a2d3df88fbd44079877b8f314ed97e6f",
|
|
510
543
|
"version_major": 2,
|
|
511
544
|
"version_minor": 0
|
|
512
545
|
},
|
|
@@ -1315,6 +1315,58 @@ class TileSource(IPyLeafletMixin):
|
|
|
1315
1315
|
def metadata(self) -> JSONDict:
|
|
1316
1316
|
return self.getMetadata()
|
|
1317
1317
|
|
|
1318
|
+
def _getFrameValueInformation(self, frames: List[Dict]):
|
|
1319
|
+
"""
|
|
1320
|
+
Given a `frames` list from a metadata response, return a dictionary describing
|
|
1321
|
+
the value info for any frame axes. Keys in this dictionary follow the pattern "Value[AXIS]"
|
|
1322
|
+
and each maps to a dictionary describing the axis, including a list of values, whether the
|
|
1323
|
+
axis is uniform, the units, minimum value, maximum value, and data type.
|
|
1324
|
+
|
|
1325
|
+
:param frames: A list of dictionaries describing each frame in the image
|
|
1326
|
+
:returns: A dictionary describing the values of frame axes
|
|
1327
|
+
"""
|
|
1328
|
+
refvalues: Dict[str, Dict[str, List]] = {}
|
|
1329
|
+
for frame in frames:
|
|
1330
|
+
for key, value in frame.items():
|
|
1331
|
+
if 'Value' in key:
|
|
1332
|
+
if key not in refvalues:
|
|
1333
|
+
refvalues[key] = {}
|
|
1334
|
+
value_index = str(frame.get(key.replace('Value', 'Index')))
|
|
1335
|
+
if value_index not in refvalues[key]:
|
|
1336
|
+
refvalues[key][value_index] = [value]
|
|
1337
|
+
else:
|
|
1338
|
+
refvalues[key][value_index].append(value)
|
|
1339
|
+
frame_value_info = {}
|
|
1340
|
+
for key, value_mapping in refvalues.items():
|
|
1341
|
+
axis_name = key.replace('Value', '').lower()
|
|
1342
|
+
units = None
|
|
1343
|
+
if hasattr(self, 'frameUnits') and self.frameUnits is not None:
|
|
1344
|
+
units = self.frameUnits.get(axis_name)
|
|
1345
|
+
uniform = all(len(set(value_list)) <= 1 for value_list in value_mapping.values())
|
|
1346
|
+
if uniform:
|
|
1347
|
+
# for uniform values, only record values at each axis index
|
|
1348
|
+
values = [
|
|
1349
|
+
value_list[0] for value_list in value_mapping.values() if len(value_list)
|
|
1350
|
+
]
|
|
1351
|
+
else:
|
|
1352
|
+
# for non-uniform axes, record values at every frame
|
|
1353
|
+
values = [frame.get(key) for frame in frames]
|
|
1354
|
+
try:
|
|
1355
|
+
min_val = min(values)
|
|
1356
|
+
max_val = max(values)
|
|
1357
|
+
except TypeError:
|
|
1358
|
+
min_val = None
|
|
1359
|
+
max_val = None
|
|
1360
|
+
frame_value_info[key] = dict(
|
|
1361
|
+
values=values,
|
|
1362
|
+
uniform=uniform,
|
|
1363
|
+
units=units,
|
|
1364
|
+
min=min_val,
|
|
1365
|
+
max=max_val,
|
|
1366
|
+
datatype=np.array(values).dtype.name,
|
|
1367
|
+
)
|
|
1368
|
+
return frame_value_info
|
|
1369
|
+
|
|
1318
1370
|
def _addMetadataFrameInformation(
|
|
1319
1371
|
self, metadata: JSONDict, channels: Optional[List[str]] = None) -> None:
|
|
1320
1372
|
"""
|
|
@@ -1346,6 +1398,7 @@ class TileSource(IPyLeafletMixin):
|
|
|
1346
1398
|
metadata['frames'][idx].get(key) for key in refkeys)):
|
|
1347
1399
|
index += 1
|
|
1348
1400
|
frame['Index'] = index
|
|
1401
|
+
metadata.update(self._getFrameValueInformation(metadata['frames']))
|
|
1349
1402
|
if any(val > 1 for val in maxref.values()):
|
|
1350
1403
|
metadata['IndexRange'] = {key: value for key, value in maxref.items() if value > 1}
|
|
1351
1404
|
metadata['IndexStride'] = {
|