large-image 1.30.2__tar.gz → 1.30.2.dev2__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/large_image.egg-info → large_image-1.30.2.dev2}/PKG-INFO +74 -74
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/getting_started.rst +6 -53
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/girder_config_options.rst +2 -6
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/notebooks/zarr_sink_example.ipynb +29 -62
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/base.py +1 -55
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/utilities.py +0 -6
- {large_image-1.30.2 → large_image-1.30.2.dev2/large_image.egg-info}/PKG-INFO +74 -74
- large_image-1.30.2.dev2/large_image.egg-info/requires.txt +151 -0
- large_image-1.30.2/large_image.egg-info/requires.txt +0 -151
- {large_image-1.30.2 → large_image-1.30.2.dev2}/LICENSE +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/NOTICE +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/README.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/annotations.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/api_index.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/caching.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/conf.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/config_options.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/development.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/dicomweb_assetstore.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/format_examples_datastore.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/formats.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/generate_format_table.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/girder_annotation_config_options.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/girder_caching.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/girder_index.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/image_conversion.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/index.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/make_docs.sh +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/multi_source_specification.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/notebooks/large_image_examples.ipynb +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/notebooks.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/plottable.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/static/K.png +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/static/custom.css +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/tilesource_options.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/upgrade.rst +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/__init__.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/__init__.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/base.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/cache.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/cachefactory.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/memcache.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/rediscache.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/config.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/constants.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/exceptions.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/__init__.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/geo.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/jupyter.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/resample.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/stylefuncs.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/tiledict.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/tileiterator.py +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image.egg-info/SOURCES.txt +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image.egg-info/dependency_links.txt +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image.egg-info/not-zip-safe +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image.egg-info/top_level.txt +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/setup.cfg +0 -0
- {large_image-1.30.2 → large_image-1.30.2.dev2}/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.dev2
|
|
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; extra == "converter"
|
|
33
|
+
Requires-Dist: large-image-converter>=1.30.2.dev2; 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; extra == "bioformats"
|
|
42
|
+
Requires-Dist: large-image-source-bioformats>=1.30.2.dev2; extra == "bioformats"
|
|
43
43
|
Provides-Extra: deepzoom
|
|
44
|
-
Requires-Dist: large-image-source-deepzoom>=1.30.2; extra == "deepzoom"
|
|
44
|
+
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev2; extra == "deepzoom"
|
|
45
45
|
Provides-Extra: dicom
|
|
46
|
-
Requires-Dist: large-image-source-dicom>=1.30.2; extra == "dicom"
|
|
46
|
+
Requires-Dist: large-image-source-dicom>=1.30.2.dev2; extra == "dicom"
|
|
47
47
|
Provides-Extra: dummy
|
|
48
|
-
Requires-Dist: large-image-source-dummy>=1.30.2; extra == "dummy"
|
|
48
|
+
Requires-Dist: large-image-source-dummy>=1.30.2.dev2; extra == "dummy"
|
|
49
49
|
Provides-Extra: gdal
|
|
50
|
-
Requires-Dist: large-image-source-gdal>=1.30.2; extra == "gdal"
|
|
50
|
+
Requires-Dist: large-image-source-gdal>=1.30.2.dev2; extra == "gdal"
|
|
51
51
|
Provides-Extra: mapnik
|
|
52
|
-
Requires-Dist: large-image-source-mapnik>=1.30.2; extra == "mapnik"
|
|
52
|
+
Requires-Dist: large-image-source-mapnik>=1.30.2.dev2; extra == "mapnik"
|
|
53
53
|
Provides-Extra: multi
|
|
54
|
-
Requires-Dist: large-image-source-multi>=1.30.2; extra == "multi"
|
|
54
|
+
Requires-Dist: large-image-source-multi>=1.30.2.dev2; extra == "multi"
|
|
55
55
|
Provides-Extra: nd2
|
|
56
|
-
Requires-Dist: large-image-source-nd2>=1.30.2; extra == "nd2"
|
|
56
|
+
Requires-Dist: large-image-source-nd2>=1.30.2.dev2; extra == "nd2"
|
|
57
57
|
Provides-Extra: ometiff
|
|
58
|
-
Requires-Dist: large-image-source-ometiff>=1.30.2; extra == "ometiff"
|
|
58
|
+
Requires-Dist: large-image-source-ometiff>=1.30.2.dev2; extra == "ometiff"
|
|
59
59
|
Provides-Extra: openjpeg
|
|
60
|
-
Requires-Dist: large-image-source-openjpeg>=1.30.2; extra == "openjpeg"
|
|
60
|
+
Requires-Dist: large-image-source-openjpeg>=1.30.2.dev2; extra == "openjpeg"
|
|
61
61
|
Provides-Extra: openslide
|
|
62
|
-
Requires-Dist: large-image-source-openslide>=1.30.2; extra == "openslide"
|
|
62
|
+
Requires-Dist: large-image-source-openslide>=1.30.2.dev2; extra == "openslide"
|
|
63
63
|
Provides-Extra: pil
|
|
64
|
-
Requires-Dist: large-image-source-pil>=1.30.2; extra == "pil"
|
|
64
|
+
Requires-Dist: large-image-source-pil>=1.30.2.dev2; extra == "pil"
|
|
65
65
|
Provides-Extra: rasterio
|
|
66
|
-
Requires-Dist: large-image-source-rasterio>=1.30.2; extra == "rasterio"
|
|
66
|
+
Requires-Dist: large-image-source-rasterio>=1.30.2.dev2; extra == "rasterio"
|
|
67
67
|
Provides-Extra: test
|
|
68
|
-
Requires-Dist: large-image-source-test>=1.30.2; extra == "test"
|
|
68
|
+
Requires-Dist: large-image-source-test>=1.30.2.dev2; extra == "test"
|
|
69
69
|
Provides-Extra: tiff
|
|
70
|
-
Requires-Dist: large-image-source-tiff>=1.30.2; extra == "tiff"
|
|
70
|
+
Requires-Dist: large-image-source-tiff>=1.30.2.dev2; extra == "tiff"
|
|
71
71
|
Provides-Extra: tifffile
|
|
72
|
-
Requires-Dist: large-image-source-tifffile>=1.30.2; extra == "tifffile"
|
|
72
|
+
Requires-Dist: large-image-source-tifffile>=1.30.2.dev2; extra == "tifffile"
|
|
73
73
|
Provides-Extra: vips
|
|
74
|
-
Requires-Dist: large-image-source-vips>=1.30.2; extra == "vips"
|
|
74
|
+
Requires-Dist: large-image-source-vips>=1.30.2.dev2; extra == "vips"
|
|
75
75
|
Provides-Extra: zarr
|
|
76
|
-
Requires-Dist: large-image-source-zarr>=1.30.2; extra == "zarr"
|
|
76
|
+
Requires-Dist: large-image-source-zarr>=1.30.2.dev2; 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-
|
|
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-
|
|
78
|
+
Requires-Dist: large-image-source-mapnik>=1.30.2.dev2; extra == "sources"
|
|
79
|
+
Requires-Dist: large-image-source-multi>=1.30.2.dev2; extra == "sources"
|
|
80
|
+
Requires-Dist: large-image-source-dicom>=1.30.2.dev2; extra == "sources"
|
|
81
|
+
Requires-Dist: large-image-source-ometiff>=1.30.2.dev2; extra == "sources"
|
|
82
|
+
Requires-Dist: large-image-source-tiff>=1.30.2.dev2; extra == "sources"
|
|
83
|
+
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev2; extra == "sources"
|
|
84
|
+
Requires-Dist: large-image-source-vips>=1.30.2.dev2; extra == "sources"
|
|
85
|
+
Requires-Dist: large-image-source-bioformats>=1.30.2.dev2; extra == "sources"
|
|
86
|
+
Requires-Dist: large-image-source-nd2>=1.30.2.dev2; extra == "sources"
|
|
87
|
+
Requires-Dist: large-image-source-openjpeg>=1.30.2.dev2; extra == "sources"
|
|
88
|
+
Requires-Dist: large-image-source-pil>=1.30.2.dev2; extra == "sources"
|
|
89
|
+
Requires-Dist: large-image-source-test>=1.30.2.dev2; extra == "sources"
|
|
90
|
+
Requires-Dist: large-image-source-rasterio>=1.30.2.dev2; extra == "sources"
|
|
91
|
+
Requires-Dist: large-image-source-gdal>=1.30.2.dev2; extra == "sources"
|
|
92
|
+
Requires-Dist: large-image-source-openslide>=1.30.2.dev2; extra == "sources"
|
|
93
|
+
Requires-Dist: large-image-source-tifffile>=1.30.2.dev2; extra == "sources"
|
|
94
|
+
Requires-Dist: large-image-source-dummy>=1.30.2.dev2; extra == "sources"
|
|
95
|
+
Requires-Dist: large-image-source-zarr>=1.30.2.dev2; extra == "sources"
|
|
96
96
|
Provides-Extra: all
|
|
97
|
-
Requires-Dist: large-image-source-
|
|
98
|
-
Requires-Dist:
|
|
99
|
-
Requires-Dist: large-image-source-dicom>=1.30.2; extra == "all"
|
|
97
|
+
Requires-Dist: large-image-source-mapnik>=1.30.2.dev2; extra == "all"
|
|
98
|
+
Requires-Dist: psutil>=4.2.0; extra == "all"
|
|
99
|
+
Requires-Dist: large-image-source-dicom>=1.30.2.dev2; extra == "all"
|
|
100
|
+
Requires-Dist: large-image-source-vips>=1.30.2.dev2; extra == "all"
|
|
101
|
+
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev2; extra == "all"
|
|
102
|
+
Requires-Dist: large-image-converter>=1.30.2.dev2; extra == "all"
|
|
103
|
+
Requires-Dist: large-image-source-openjpeg>=1.30.2.dev2; extra == "all"
|
|
104
|
+
Requires-Dist: large-image-source-test>=1.30.2.dev2; extra == "all"
|
|
105
|
+
Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev2; extra == "all"
|
|
106
|
+
Requires-Dist: large-image-source-rasterio>=1.30.2.dev2; extra == "all"
|
|
107
|
+
Requires-Dist: large-image-source-gdal>=1.30.2.dev2; extra == "all"
|
|
108
|
+
Requires-Dist: large-image-source-zarr>=1.30.2.dev2; extra == "all"
|
|
100
109
|
Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "all"
|
|
101
|
-
Requires-Dist: large-image-source-
|
|
102
|
-
Requires-Dist: large-image-source-bioformats>=1.30.2; extra == "all"
|
|
103
|
-
Requires-Dist: large-image-source-tifffile>=1.30.2; extra == "all"
|
|
104
|
-
Requires-Dist: large-image-source-vips>=1.30.2; extra == "all"
|
|
105
|
-
Requires-Dist: large-image-source-dummy>=1.30.2; extra == "all"
|
|
106
|
-
Requires-Dist: pyvips; extra == "all"
|
|
107
|
-
Requires-Dist: large-image-source-deepzoom>=1.30.2; extra == "all"
|
|
108
|
-
Requires-Dist: large-image-source-pil[all]>=1.30.2; extra == "all"
|
|
109
|
-
Requires-Dist: large-image-converter>=1.30.2; extra == "all"
|
|
110
|
-
Requires-Dist: large-image-source-rasterio[all]>=1.30.2; extra == "all"
|
|
111
|
-
Requires-Dist: large-image-source-test>=1.30.2; extra == "all"
|
|
112
|
-
Requires-Dist: large-image-source-nd2>=1.30.2; extra == "all"
|
|
113
|
-
Requires-Dist: large-image-source-tiff[all]>=1.30.2; extra == "all"
|
|
114
|
-
Requires-Dist: large-image-source-rasterio>=1.30.2; extra == "all"
|
|
115
|
-
Requires-Dist: large-image-source-multi[all]>=1.30.2; extra == "all"
|
|
116
|
-
Requires-Dist: redis>=4.5.5; extra == "all"
|
|
110
|
+
Requires-Dist: large-image-source-multi[all]>=1.30.2.dev2; extra == "all"
|
|
117
111
|
Requires-Dist: matplotlib; extra == "all"
|
|
118
|
-
Requires-Dist: large-image-source-
|
|
119
|
-
Requires-Dist:
|
|
120
|
-
Requires-Dist: large-image-source-
|
|
112
|
+
Requires-Dist: large-image-source-multi>=1.30.2.dev2; extra == "all"
|
|
113
|
+
Requires-Dist: large-image-source-ometiff>=1.30.2.dev2; extra == "all"
|
|
114
|
+
Requires-Dist: large-image-source-tiff>=1.30.2.dev2; extra == "all"
|
|
115
|
+
Requires-Dist: large-image-source-pil[all]>=1.30.2.dev2; extra == "all"
|
|
121
116
|
Requires-Dist: simplejpeg; extra == "all"
|
|
122
|
-
Requires-Dist: large-image-source-
|
|
123
|
-
Requires-Dist: large-image-source-
|
|
124
|
-
Requires-Dist: large-image-source-
|
|
125
|
-
Requires-Dist:
|
|
117
|
+
Requires-Dist: large-image-source-bioformats>=1.30.2.dev2; extra == "all"
|
|
118
|
+
Requires-Dist: large-image-source-nd2>=1.30.2.dev2; extra == "all"
|
|
119
|
+
Requires-Dist: large-image-source-pil>=1.30.2.dev2; extra == "all"
|
|
120
|
+
Requires-Dist: redis>=4.5.5; extra == "all"
|
|
121
|
+
Requires-Dist: pyvips; extra == "all"
|
|
122
|
+
Requires-Dist: large-image-source-tiff[all]>=1.30.2.dev2; extra == "all"
|
|
123
|
+
Requires-Dist: large-image-source-openslide>=1.30.2.dev2; extra == "all"
|
|
124
|
+
Requires-Dist: large-image-source-tifffile>=1.30.2.dev2; extra == "all"
|
|
125
|
+
Requires-Dist: large-image-source-dummy>=1.30.2.dev2; extra == "all"
|
|
126
126
|
Provides-Extra: common
|
|
127
|
-
Requires-Dist: large-image-source-pil[all]>=1.30.2; extra == "common"
|
|
128
|
-
Requires-Dist: large-image-source-rasterio[all]>=1.30.2; extra == "common"
|
|
129
|
-
Requires-Dist: large-image-source-test>=1.30.2; extra == "common"
|
|
130
|
-
Requires-Dist: large-image-source-nd2>=1.30.2; extra == "common"
|
|
131
|
-
Requires-Dist: large-image-source-dicom>=1.30.2; extra == "common"
|
|
132
|
-
Requires-Dist: redis>=4.5.5; extra == "common"
|
|
133
127
|
Requires-Dist: matplotlib; extra == "common"
|
|
134
|
-
Requires-Dist: large-image-source-
|
|
128
|
+
Requires-Dist: large-image-source-multi>=1.30.2.dev2; extra == "common"
|
|
135
129
|
Requires-Dist: psutil>=4.2.0; extra == "common"
|
|
130
|
+
Requires-Dist: large-image-source-dicom>=1.30.2.dev2; extra == "common"
|
|
131
|
+
Requires-Dist: large-image-source-pil[all]>=1.30.2.dev2; extra == "common"
|
|
136
132
|
Requires-Dist: simplejpeg; extra == "common"
|
|
137
|
-
Requires-Dist: large-image-source-
|
|
133
|
+
Requires-Dist: large-image-source-deepzoom>=1.30.2.dev2; extra == "common"
|
|
134
|
+
Requires-Dist: large-image-source-nd2>=1.30.2.dev2; extra == "common"
|
|
135
|
+
Requires-Dist: redis>=4.5.5; extra == "common"
|
|
136
|
+
Requires-Dist: large-image-source-test>=1.30.2.dev2; extra == "common"
|
|
137
|
+
Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev2; extra == "common"
|
|
138
|
+
Requires-Dist: large-image-source-zarr>=1.30.2.dev2; extra == "common"
|
|
138
139
|
Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "common"
|
|
139
|
-
Requires-Dist: large-image-source-tifffile>=1.30.2; extra == "common"
|
|
140
|
-
Requires-Dist: large-image-source-deepzoom>=1.30.2; extra == "common"
|
|
140
|
+
Requires-Dist: large-image-source-tifffile>=1.30.2.dev2; extra == "common"
|
|
141
141
|
|
|
142
142
|
Large Image
|
|
143
143
|
===========
|
|
@@ -334,60 +334,25 @@ 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,
|
|
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``.
|
|
337
|
+
If you wish to visualize numpy data, large_image can write a tiled tiff. This requires a tile source that supports writing to be installed. As of this writing, the ``large-image-source-zarr`` and ``large-image-source-vips`` sources supports this. If both are installed, the ``large-image-source-zarr`` is the default.
|
|
342
338
|
|
|
343
339
|
.. code-block:: python
|
|
344
340
|
|
|
345
341
|
import large_image
|
|
346
|
-
|
|
347
342
|
source = large_image.new()
|
|
348
343
|
for nparray, x, y in fancy_algorithm():
|
|
349
344
|
# We could optionally add a mask to limit the output
|
|
350
345
|
source.addTile(nparray, x, y)
|
|
351
346
|
source.write('/tmp/sample.tiff', lossy=False)
|
|
352
347
|
|
|
353
|
-
|
|
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.
|
|
348
|
+
The ``large-image-source-zarr`` can be used to store multiple frame data with arbitrary axes.
|
|
358
349
|
|
|
359
350
|
.. code-block:: python
|
|
360
351
|
|
|
361
352
|
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
|
-
|
|
367
353
|
source = large_image.new()
|
|
368
|
-
for
|
|
369
|
-
|
|
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
|
-
|
|
354
|
+
for nparray, x, y, time, param1 in fancy_algorithm():
|
|
355
|
+
source.addTile(nparray, x, y, time=time, p1=param1)
|
|
391
356
|
# The writer supports a variety of formats
|
|
392
357
|
source.write('/tmp/sample.zarr.zip', lossy=False)
|
|
393
358
|
|
|
@@ -396,37 +361,31 @@ You may also choose to read tiles from one source and write modified tiles to a
|
|
|
396
361
|
.. code-block:: python
|
|
397
362
|
|
|
398
363
|
import large_image
|
|
399
|
-
|
|
400
364
|
original_source = large_image.open('path/to/original/image.tiff')
|
|
401
365
|
new_source = large_image.new()
|
|
402
366
|
for frame in original_source.getMetadata().get('frames', []):
|
|
403
367
|
for tile in original_source.tileIterator(frame=frame['Frame'], format='numpy'):
|
|
404
|
-
|
|
368
|
+
t, x, y = tile['tile'], tile['x'], tile['y']
|
|
405
369
|
kwargs = {
|
|
406
370
|
'z': frame['IndexZ'],
|
|
407
371
|
'c': frame['IndexC'],
|
|
408
372
|
}
|
|
409
|
-
modified_tile = modify_tile(
|
|
373
|
+
modified_tile = modify_tile(t)
|
|
410
374
|
new_source.addTile(modified_tile, x=x, y=y, **kwargs)
|
|
411
375
|
new_source.write('path/to/new/image.tiff', lossy=False)
|
|
412
376
|
|
|
413
|
-
Multiple processes
|
|
414
|
-
~~~~~~~~~~~~~~~~~~
|
|
415
|
-
|
|
416
377
|
In some cases, it may be beneficial to write to a single image from multiple processes or threads:
|
|
417
378
|
|
|
418
379
|
.. code-block:: python
|
|
419
380
|
|
|
420
381
|
import large_image
|
|
421
382
|
import multiprocessing
|
|
422
|
-
|
|
423
383
|
# Important: Must be a pickleable function
|
|
424
384
|
def add_tile_to_source(tilesource, nparray, position):
|
|
425
385
|
tilesource.addTile(
|
|
426
386
|
nparray,
|
|
427
387
|
**position
|
|
428
388
|
)
|
|
429
|
-
|
|
430
389
|
source = large_image.new()
|
|
431
390
|
# Important: Maximum size must be allocated before any multiprocess concurrency
|
|
432
391
|
add_tile_to_source(source, np.zeros(1, 1, 3), dict(x=max_x, y=max_y, z=max_z))
|
|
@@ -438,10 +397,4 @@ In some cases, it may be beneficial to write to a single image from multiple pro
|
|
|
438
397
|
)
|
|
439
398
|
source.write('/tmp/sample.zarr.zip', lossy=False)
|
|
440
399
|
|
|
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
|
-
|
|
447
400
|
.. _Girder: https://girder.readthedocs.io/en/latest/
|
|
@@ -94,14 +94,10 @@ This is used to specify how items appear in item lists. There are two settings,
|
|
|
94
94
|
# clicking on an item from showing the item page to another action.
|
|
95
95
|
navigate:
|
|
96
96
|
# type can be "item": the default, open the item page, "itemList": go
|
|
97
|
-
# to the named item page
|
|
97
|
+
# to the named item page
|
|
98
98
|
type: itemList
|
|
99
99
|
# if the type is "itemList", the name is the name of the itemList to
|
|
100
|
-
# display.
|
|
101
|
-
# registered application that should be opened by preference (e.g.,
|
|
102
|
-
# "histomicsui" or "volview"). If that application does not report it
|
|
103
|
-
# can open the item or no name is specified, the highest priority
|
|
104
|
-
# application that can open the item will be used.
|
|
100
|
+
# display.
|
|
105
101
|
name: studyList
|
|
106
102
|
# show these columns in order from left to right. Each column has a
|
|
107
103
|
# "type" and "value". It optionally has a "title" used for the column
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"cell_type": "code",
|
|
25
|
-
"execution_count":
|
|
25
|
+
"execution_count": null,
|
|
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": null,
|
|
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": "bf6d0e9480cb43ef9851d7bd3ca7e356",
|
|
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": null,
|
|
195
195
|
"id": "0e75e6de",
|
|
196
196
|
"metadata": {},
|
|
197
197
|
"outputs": [],
|
|
@@ -228,22 +228,10 @@
|
|
|
228
228
|
"data": {
|
|
229
229
|
"application/json": {
|
|
230
230
|
"IndexRange": {
|
|
231
|
-
"
|
|
231
|
+
"IndexI": 3
|
|
232
232
|
},
|
|
233
233
|
"IndexStride": {
|
|
234
|
-
"
|
|
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
|
-
]
|
|
234
|
+
"IndexI": 1
|
|
247
235
|
},
|
|
248
236
|
"bandCount": 3,
|
|
249
237
|
"channelmap": {
|
|
@@ -258,22 +246,19 @@
|
|
|
258
246
|
"Channel": "Band 1",
|
|
259
247
|
"Frame": 0,
|
|
260
248
|
"Index": 0,
|
|
261
|
-
"
|
|
262
|
-
"ValueFOOTPRINT": 1
|
|
249
|
+
"IndexI": 0
|
|
263
250
|
},
|
|
264
251
|
{
|
|
265
252
|
"Channel": "Band 1",
|
|
266
253
|
"Frame": 1,
|
|
267
254
|
"Index": 1,
|
|
268
|
-
"
|
|
269
|
-
"ValueFOOTPRINT": 10
|
|
255
|
+
"IndexI": 1
|
|
270
256
|
},
|
|
271
257
|
{
|
|
272
258
|
"Channel": "Band 1",
|
|
273
259
|
"Frame": 2,
|
|
274
260
|
"Index": 2,
|
|
275
|
-
"
|
|
276
|
-
"ValueFOOTPRINT": 50
|
|
261
|
+
"IndexI": 2
|
|
277
262
|
}
|
|
278
263
|
],
|
|
279
264
|
"levels": 6,
|
|
@@ -296,34 +281,16 @@
|
|
|
296
281
|
" 'mm_y': 0,\n",
|
|
297
282
|
" 'dtype': 'float64',\n",
|
|
298
283
|
" 'bandCount': 3,\n",
|
|
299
|
-
" 'frames': [{'Frame': 0,\n",
|
|
300
|
-
"
|
|
301
|
-
"
|
|
302
|
-
"
|
|
303
|
-
"
|
|
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",
|
|
284
|
+
" 'frames': [{'Frame': 0, 'IndexI': 0, 'Index': 0, 'Channel': 'Band 1'},\n",
|
|
285
|
+
" {'Frame': 1, 'IndexI': 1, 'Index': 1, 'Channel': 'Band 1'},\n",
|
|
286
|
+
" {'Frame': 2, 'IndexI': 2, 'Index': 2, 'Channel': 'Band 1'}],\n",
|
|
287
|
+
" 'IndexRange': {'IndexI': 3},\n",
|
|
288
|
+
" 'IndexStride': {'IndexI': 1},\n",
|
|
322
289
|
" 'channels': ['Band 1'],\n",
|
|
323
290
|
" 'channelmap': {'Band 1': 0}}"
|
|
324
291
|
]
|
|
325
292
|
},
|
|
326
|
-
"execution_count":
|
|
293
|
+
"execution_count": 7,
|
|
327
294
|
"metadata": {},
|
|
328
295
|
"output_type": "execute_result"
|
|
329
296
|
}
|
|
@@ -348,7 +315,7 @@
|
|
|
348
315
|
"\n",
|
|
349
316
|
" # add modified tile to sink\n",
|
|
350
317
|
" # specify tile x, tile y, and any arbitrary frame parameters\n",
|
|
351
|
-
" sink.addTile(processed_tile, x=tile['x'], y=tile['y'],
|
|
318
|
+
" sink.addTile(processed_tile, x=tile['x'], y=tile['y'], i=i)\n",
|
|
352
319
|
"# view metadata\n",
|
|
353
320
|
"sink.getMetadata()"
|
|
354
321
|
]
|
|
@@ -362,7 +329,7 @@
|
|
|
362
329
|
{
|
|
363
330
|
"data": {
|
|
364
331
|
"application/vnd.jupyter.widget-view+json": {
|
|
365
|
-
"model_id": "
|
|
332
|
+
"model_id": "9b8e6175005d4af89cb4cfada7b72983",
|
|
366
333
|
"version_major": 2,
|
|
367
334
|
"version_minor": 0
|
|
368
335
|
},
|
|
@@ -431,10 +398,10 @@
|
|
|
431
398
|
"data": {
|
|
432
399
|
"application/json": {
|
|
433
400
|
"IndexRange": {
|
|
434
|
-
"
|
|
401
|
+
"IndexI": 3
|
|
435
402
|
},
|
|
436
403
|
"IndexStride": {
|
|
437
|
-
"
|
|
404
|
+
"IndexI": 1
|
|
438
405
|
},
|
|
439
406
|
"bandCount": 3,
|
|
440
407
|
"channelmap": {
|
|
@@ -449,19 +416,19 @@
|
|
|
449
416
|
"Channel": "Band 1",
|
|
450
417
|
"Frame": 0,
|
|
451
418
|
"Index": 0,
|
|
452
|
-
"
|
|
419
|
+
"IndexI": 0
|
|
453
420
|
},
|
|
454
421
|
{
|
|
455
422
|
"Channel": "Band 1",
|
|
456
423
|
"Frame": 1,
|
|
457
424
|
"Index": 1,
|
|
458
|
-
"
|
|
425
|
+
"IndexI": 1
|
|
459
426
|
},
|
|
460
427
|
{
|
|
461
428
|
"Channel": "Band 1",
|
|
462
429
|
"Frame": 2,
|
|
463
430
|
"Index": 2,
|
|
464
|
-
"
|
|
431
|
+
"IndexI": 2
|
|
465
432
|
}
|
|
466
433
|
],
|
|
467
434
|
"levels": 4,
|
|
@@ -484,16 +451,16 @@
|
|
|
484
451
|
" 'mm_y': None,\n",
|
|
485
452
|
" 'dtype': 'uint16',\n",
|
|
486
453
|
" 'bandCount': 3,\n",
|
|
487
|
-
" 'frames': [{'Channel': 'Band 1', 'Frame': 0, 'Index': 0, '
|
|
488
|
-
" {'Channel': 'Band 1', 'Frame': 1, 'Index': 1, '
|
|
489
|
-
" {'Channel': 'Band 1', 'Frame': 2, 'Index': 2, '
|
|
490
|
-
" 'IndexRange': {'
|
|
491
|
-
" 'IndexStride': {'
|
|
454
|
+
" 'frames': [{'Channel': 'Band 1', 'Frame': 0, 'Index': 0, 'IndexI': 0},\n",
|
|
455
|
+
" {'Channel': 'Band 1', 'Frame': 1, 'Index': 1, 'IndexI': 1},\n",
|
|
456
|
+
" {'Channel': 'Band 1', 'Frame': 2, 'Index': 2, 'IndexI': 2}],\n",
|
|
457
|
+
" 'IndexRange': {'IndexI': 3},\n",
|
|
458
|
+
" 'IndexStride': {'IndexI': 1},\n",
|
|
492
459
|
" 'channels': ['Band 1'],\n",
|
|
493
460
|
" 'channelmap': {'Band 1': 0}}"
|
|
494
461
|
]
|
|
495
462
|
},
|
|
496
|
-
"execution_count":
|
|
463
|
+
"execution_count": 10,
|
|
497
464
|
"metadata": {},
|
|
498
465
|
"output_type": "execute_result"
|
|
499
466
|
}
|
|
@@ -539,7 +506,7 @@
|
|
|
539
506
|
{
|
|
540
507
|
"data": {
|
|
541
508
|
"application/vnd.jupyter.widget-view+json": {
|
|
542
|
-
"model_id": "
|
|
509
|
+
"model_id": "30812bb388a0426da9806e62bf5e8711",
|
|
543
510
|
"version_major": 2,
|
|
544
511
|
"version_minor": 0
|
|
545
512
|
},
|
|
@@ -1315,58 +1315,6 @@ 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
|
-
|
|
1370
1318
|
def _addMetadataFrameInformation(
|
|
1371
1319
|
self, metadata: JSONDict, channels: Optional[List[str]] = None) -> None:
|
|
1372
1320
|
"""
|
|
@@ -1398,7 +1346,6 @@ class TileSource(IPyLeafletMixin):
|
|
|
1398
1346
|
metadata['frames'][idx].get(key) for key in refkeys)):
|
|
1399
1347
|
index += 1
|
|
1400
1348
|
frame['Index'] = index
|
|
1401
|
-
metadata.update(self._getFrameValueInformation(metadata['frames']))
|
|
1402
1349
|
if any(val > 1 for val in maxref.values()):
|
|
1403
1350
|
metadata['IndexRange'] = {key: value for key, value in maxref.items() if value > 1}
|
|
1404
1351
|
metadata['IndexStride'] = {
|
|
@@ -1569,8 +1516,7 @@ class TileSource(IPyLeafletMixin):
|
|
|
1569
1516
|
if (scale >= max(self.tileWidth, self.tileHeight) or
|
|
1570
1517
|
(self.dtype and self.dtype != np.uint8) or
|
|
1571
1518
|
(self.bandCount and self.bandCount > 4)):
|
|
1572
|
-
nptile = np.zeros((self.tileHeight, self.tileWidth, cast(int, self.bandCount))
|
|
1573
|
-
dtype=self.dtype)
|
|
1519
|
+
nptile = np.zeros((self.tileHeight, self.tileWidth, cast(int, self.bandCount)))
|
|
1574
1520
|
maxX = 2.0 ** (z + 1 - self.levels) * self.sizeX / self.tileWidth
|
|
1575
1521
|
maxY = 2.0 ** (z + 1 - self.levels) * self.sizeY / self.tileHeight
|
|
1576
1522
|
for newY in range(scale):
|
|
@@ -217,12 +217,6 @@ def _imageToPIL(
|
|
|
217
217
|
image = np.floor_divide(image, 2 ** 24).astype(np.uint8)
|
|
218
218
|
elif image.dtype == np.uint16:
|
|
219
219
|
image = np.floor_divide(image, 256).astype(np.uint8)
|
|
220
|
-
elif image.dtype == np.int8:
|
|
221
|
-
image = (image.astype(float) + 128).astype(np.uint8)
|
|
222
|
-
elif image.dtype == np.int16:
|
|
223
|
-
image = np.floor_divide(image.astype(float) + 2 ** 15, 256).astype(np.uint8)
|
|
224
|
-
elif image.dtype == np.int32:
|
|
225
|
-
image = np.floor_divide(image.astype(float) + 2 ** 31, 2 ** 24).astype(np.uint8)
|
|
226
220
|
# TODO: The scaling of float data needs to be identical across all
|
|
227
221
|
# tiles of an image. This means that we need a reference to the parent
|
|
228
222
|
# tile source or some other way of regulating it.
|