forked from DigitalSlideArchive/HistomicsStream
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcodecs.py
More file actions
162 lines (121 loc) · 4.31 KB
/
codecs.py
File metadata and controls
162 lines (121 loc) · 4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# =========================================================================
#
# Copyright NumFOCUS
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0.txt
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# =========================================================================
"""Whole-slide image streamer for machine learning frameworks.
The histomics_stream.codecs module supplies codecs that are useful for Zarr file storage
with jpeg or jpeg2k compression.
"""
from imagecodecs import jpeg_encode, jpeg_decode, jpeg2k_encode, jpeg2k_decode
from numcodecs.abc import Codec
from numcodecs.compat import ensure_ndarray, ensure_contiguous_ndarray, ndarray_copy
from numcodecs.registry import register_codec
class jpeg(Codec):
"""Codec providing jpeg compression via imagecodecs.
Parameters
----------
quality : int
Compression level.
Notes
-----
For the code that uses Zarr data storage for jpeg images, we need to supply codecs.
Note that we use this codec instead of that available from the zarr_jpeg package.
The latter collapses dimensions by default, can require us to transpose dimensions,
and can miss optimizations based upon RGB data.
"""
codec_id = "jpeg"
def __init__(self, quality=100):
self.quality = quality
assert 0 < self.quality <= 100 and isinstance(self.quality, int)
super().__init__()
def encode(self, buf):
"""The method to encode a raw image into jpeg format.
Parameters
----------
buf : ndarray
The raw image to be encoded into jpeg format
Returns
-------
ndarray
The image in jpeg format
"""
bufa = ensure_ndarray(buf)
assert 2 <= bufa.ndim <= 3
return jpeg_encode(bufa, level=self.quality)
def decode(self, buf, out=None):
"""The method to decode a jpeg image into a raw format.
Parameters
----------
buf : contiguous_ndarray
The jpeg image to be decoded into raw format.
out : contiguous_ndarray, optional
Another location to write the raw image to.
Returns
-------
ndarray
The image in raw format
"""
buf = ensure_contiguous_ndarray(buf)
if out is not None:
out = ensure_contiguous_ndarray(out)
tiled = jpeg_decode(buf)
return ndarray_copy(tiled, out)
register_codec(jpeg)
class jpeg2k(Codec):
"""Codec providing jpeg2k compression via imagecodecs.
Parameters
----------
quality : int
Compression level.
"""
codec_id = "jpeg2k"
def __init__(self, quality=100):
self.quality = quality
assert 0 < self.quality <= 100 and isinstance(self.quality, int)
super().__init__()
def encode(self, buf):
"""The method to encode a raw image into jpeg2k format.
Parameters
----------
buf : ndarray
The raw image to be encoded into jpeg2k format
Returns
-------
ndarray
The image in jpeg2k format
"""
bufa = ensure_ndarray(buf)
assert 2 <= bufa.ndim <= 3
return jpeg2k_encode(bufa, level=self.quality)
def decode(self, buf, out=None):
"""The method to decode a jpeg2k image into a raw format.
Parameters
----------
buf : contiguous_ndarray
The jpeg2k image to be decoded into raw format.
out : contiguous_ndarray, optional
Another location to write the raw image to.
Returns
-------
ndarray
The image in raw format
"""
buf = ensure_contiguous_ndarray(buf)
if out is not None:
out = ensure_contiguous_ndarray(out)
tiled = jpeg2k_decode(buf)
return ndarray_copy(tiled, out)
register_codec(jpeg2k)