dcnum 0.17.1__py3-none-any.whl → 0.18.0__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.

Potentially problematic release.


This version of dcnum might be problematic. Click here for more details.

dcnum/segm/segmenter.py CHANGED
@@ -68,10 +68,8 @@ class Segmenter(abc.ABC):
68
68
  def get_border(shape):
69
69
  """Cached boolean image with outer pixels set to True"""
70
70
  border = np.zeros(shape, dtype=bool)
71
- border[0, :] = True
72
- border[-1, :] = True
73
- border[:, 0] = True
74
- border[:, -1] = True
71
+ border[[0, -1], :] = True
72
+ border[:, [0, -1]] = True
75
73
  return border
76
74
 
77
75
  @staticmethod
@@ -121,25 +119,40 @@ class Segmenter(abc.ABC):
121
119
  get_ppid: Same method for class instances
122
120
  """
123
121
  kwargs = copy.deepcopy(kwargs)
124
- if kwargs_mask is None and kwargs.get("kwargs_mask", None) is None:
125
- raise KeyError("`kwargs_mask` must be either specified as "
126
- "keyword argument to this method or as a key "
127
- "in `kwargs`!")
128
- if kwargs_mask is None:
129
- # see check above (kwargs_mask may also be {})
130
- kwargs_mask = kwargs.pop("kwargs_mask")
131
- # Start with the default mask kwargs defined for this subclass
132
- kwargs_mask_used = copy.deepcopy(cls.mask_default_kwargs)
133
- kwargs_mask_used.update(kwargs_mask)
134
- code = cls.get_ppid_code()
135
- csegm = kwargs_to_ppid(cls, "segment_approach", kwargs)
136
- cmask = kwargs_to_ppid(cls, "process_mask", kwargs_mask_used)
137
- return ":".join([code, csegm, cmask])
122
+ if cls.mask_postprocessing:
123
+ if kwargs_mask is None and kwargs.get("kwargs_mask", None) is None:
124
+ raise KeyError("`kwargs_mask` must be either specified as "
125
+ "keyword argument to this method or as a key "
126
+ "in `kwargs`!")
127
+ if kwargs_mask is None:
128
+ # see check above (kwargs_mask may also be {})
129
+ kwargs_mask = kwargs.pop("kwargs_mask")
130
+ # Start with the default mask kwargs defined for this subclass
131
+ kwargs_mask_used = copy.deepcopy(cls.mask_default_kwargs)
132
+ kwargs_mask_used.update(kwargs_mask)
133
+ elif kwargs_mask:
134
+ raise ValueError(f"The segmenter '{cls.__name__}' does not "
135
+ f"support mask postprocessing, but 'kwargs_mask' "
136
+ f"was provided: {kwargs_mask}")
137
+
138
+ ppid_parts = [
139
+ cls.get_ppid_code(),
140
+ kwargs_to_ppid(cls, "segment_approach", kwargs),
141
+ ]
142
+
143
+ if cls.mask_postprocessing:
144
+ ppid_parts.append(
145
+ kwargs_to_ppid(cls, "process_mask", kwargs_mask_used))
146
+
147
+ return ":".join(ppid_parts)
138
148
 
139
149
  @staticmethod
140
150
  def get_ppkw_from_ppid(segm_ppid):
141
151
  """Return keyword arguments for this pipeline identifier"""
142
- code, pp_kwargs, pp_kwargs_mask = segm_ppid.split(":")
152
+ ppid_parts = segm_ppid.split(":")
153
+ code = ppid_parts[0]
154
+ pp_kwargs = ppid_parts[1]
155
+
143
156
  for cls_code in get_available_segmenters():
144
157
  if cls_code == code:
145
158
  cls = get_available_segmenters()[cls_code]
@@ -150,9 +163,11 @@ class Segmenter(abc.ABC):
150
163
  kwargs = ppid_to_kwargs(cls=cls,
151
164
  method="segment_approach",
152
165
  ppid=pp_kwargs)
153
- kwargs["kwargs_mask"] = ppid_to_kwargs(cls=cls,
154
- method="process_mask",
155
- ppid=pp_kwargs_mask)
166
+ if cls.mask_postprocessing:
167
+ pp_kwargs_mask = ppid_parts[2]
168
+ kwargs["kwargs_mask"] = ppid_to_kwargs(cls=cls,
169
+ method="process_mask",
170
+ ppid=pp_kwargs_mask)
156
171
  return kwargs
157
172
 
158
173
  @staticmethod
@@ -196,25 +211,6 @@ class Segmenter(abc.ABC):
196
211
  continue
197
212
  labels[labels == li] = 0
198
213
 
199
- # scikit-image is too slow for us here. So we use OpenCV.
200
- # https://github.com/scikit-image/scikit-image/issues/1190
201
-
202
- if closing_disk:
203
- #
204
- # from skimage import morphology
205
- # morphology.binary_closing(
206
- # mask,
207
- # footprint=morphology.disk(closing_disk),
208
- # out=mask)
209
- #
210
- element = Segmenter.get_disk(closing_disk)
211
- labels_uint8 = np.array(labels, dtype=np.uint8)
212
- labels_dilated = cv2.dilate(labels_uint8, element)
213
- labels_eroded = cv2.erode(labels_dilated, element)
214
- labels, _ = ndi.label(
215
- input=labels_eroded > 0,
216
- structure=ndi.generate_binary_structure(2, 2))
217
-
218
214
  if fill_holes:
219
215
  # Floodfill only works with uint8 (too small) or int32
220
216
  if labels.dtype != np.int32:
@@ -226,17 +222,52 @@ class Segmenter(abc.ABC):
226
222
  # Floodfill algorithm fills the background image and
227
223
  # the resulting inversion is the image with holes filled.
228
224
  # This will destroy labels (adding 2,147,483,647 to background)
225
+ # Since floodfill will use the upper left corner of the image as
226
+ # a seed, we have to make sure it is set to background. We set
227
+ # a line of pixels in the upper channel wall to zero to be sure.
228
+ labels[0, :] = 0
229
+ # ...and a 4x4 pixel region in the top left corner.
230
+ labels[1, :2] = 0
229
231
  cv2.floodFill(labels, None, (0, 0), 2147483647)
230
232
  mask = labels != 2147483647
231
233
  labels, _ = ndi.label(
232
234
  input=mask,
233
235
  structure=ndi.generate_binary_structure(2, 2))
234
236
 
237
+ if closing_disk:
238
+ # scikit-image is too slow for us here. So we use OpenCV.
239
+ # https://github.com/scikit-image/scikit-image/issues/1190
240
+ #
241
+ # from skimage import morphology
242
+ # morphology.binary_closing(
243
+ # mask,
244
+ # footprint=morphology.disk(closing_disk),
245
+ # out=mask)
246
+ #
247
+ element = Segmenter.get_disk(closing_disk)
248
+ # Note: erode/dilate not implemented for int32
249
+ labels_uint8 = np.array(labels, dtype=np.uint8)
250
+ # Historically, we would like to do a closing (dilation followed
251
+ # by erosion) on the image data where lower brightness values
252
+ # meant "we have an event". However, since we are now working
253
+ # with labels instead of image data (0 is background and labels
254
+ # are enumerated with integers), high "brightness" values are
255
+ # actually the event. Thus, we have to perform an opening
256
+ # (erosion followed by dilation) of the label image.
257
+ labels_eroded = cv2.erode(labels_uint8, element)
258
+ labels_dilated = cv2.dilate(labels_eroded, element)
259
+ labels, _ = ndi.label(
260
+ input=labels_dilated > 0,
261
+ structure=ndi.generate_binary_structure(2, 2))
262
+
235
263
  return labels
236
264
 
237
- def segment_chunk(self, image_data, chunk):
265
+ def segment_chunk(self, image_data, chunk, bg_off=None):
238
266
  """Return the integer labels for one `image_data` chunk"""
239
267
  data = image_data.get_chunk(chunk)
268
+ if bg_off is not None:
269
+ bg_off_chunk = bg_off[image_data.get_chunk_slice(chunk)]
270
+ data = data - bg_off_chunk.reshape(-1, 1, 1)
240
271
  return self.segment_batch(data)
241
272
 
242
273
  def segment_frame(self, image):
@@ -96,11 +96,11 @@ class CPUSegmenter(Segmenter, abc.ABC):
96
96
  batch_size: int
97
97
  Number of images in the array
98
98
  dtype:
99
- ctype, e.g. `np.ctypeslib.ctypes.c_uint8`
100
- or `np.ctypeslib.ctypes.c_bool`
99
+ numpy dtype
101
100
  """
102
101
  sx, sy = image_shape
103
- sa_raw = mp_spawn.RawArray(dtype, int(sx * sy * batch_size))
102
+ ctype = np.ctypeslib.as_ctypes_type(dtype)
103
+ sa_raw = mp_spawn.RawArray(ctype, int(sx * sy * batch_size))
104
104
  # Convert the RawArray to something we can write to fast
105
105
  # (similar to memory view, but without having to cast) using
106
106
  # np.ctypeslib.as_array. See discussion in
@@ -172,14 +172,14 @@ class CPUSegmenter(Segmenter, abc.ABC):
172
172
  self.mp_image_raw, self._mp_image_np = self._create_shared_array(
173
173
  image_shape=self.image_shape,
174
174
  batch_size=batch_size,
175
- dtype=np.ctypeslib.ctypes.c_int32,
175
+ dtype=image_data.dtype,
176
176
  )
177
177
 
178
178
  if self._mp_labels_np is None:
179
179
  self.mp_labels_raw, self._mp_labels_np = self._create_shared_array(
180
180
  image_shape=self.image_shape,
181
181
  batch_size=batch_size,
182
- dtype=np.ctypeslib.ctypes.c_uint16,
182
+ dtype=np.uint16,
183
183
  )
184
184
 
185
185
  # populate image data
@@ -17,6 +17,7 @@ class SegmenterManagerThread(threading.Thread):
17
17
  image_data: HDF5ImageCache | ImageCorrCache,
18
18
  slot_states: mp.Array,
19
19
  slot_chunks: mp.Array,
20
+ bg_off: np.ndarray = None,
20
21
  debug: bool = False,
21
22
  *args, **kwargs):
22
23
  """Manage the segmentation of image data
@@ -38,6 +39,10 @@ class SegmenterManagerThread(threading.Thread):
38
39
  slot_chunks:
39
40
  For each slot in `slot_states`, this shared array defines
40
41
  on which chunk in `image_data` the segmentation took place.
42
+ bg_off:
43
+ 1d array containing additional background image offset values
44
+ that are added to each background image before subtraction
45
+ from the input image
41
46
  debug:
42
47
  Whether to run in debugging mode (more verbose messages and
43
48
  CPU-based segmentation is done in one single thread instead
@@ -65,6 +70,8 @@ class SegmenterManagerThread(threading.Thread):
65
70
  self.segmenter = segmenter
66
71
  #: Image data which is being segmented
67
72
  self.image_data = image_data
73
+ #: Additional, optional background offset
74
+ self.bg_off = bg_off
68
75
  #: Slot states
69
76
  self.slot_states = slot_states
70
77
  #: Current slot chunk index for the slot states
@@ -89,7 +96,7 @@ class SegmenterManagerThread(threading.Thread):
89
96
  # - "s" the extractor processed the data and is waiting
90
97
  # for the segmenter
91
98
  if self.slot_states[cur_slot] != "e":
92
- # It's the segmenters turn. Note that we use '!= "e"',
99
+ # It's the segmenter's turn. Note that we use '!= "e"',
93
100
  # because the initial value is "\x00".
94
101
  break
95
102
  else:
@@ -106,7 +113,9 @@ class SegmenterManagerThread(threading.Thread):
106
113
  # We have a free slot to compute the segmentation
107
114
  labels = self.segmenter.segment_chunk(
108
115
  image_data=self.image_data,
109
- chunk=chunk)
116
+ chunk=chunk,
117
+ bg_off=self.bg_off,
118
+ )
110
119
 
111
120
  # TODO: make this more memory efficient (pre-shared mp.Arrays?)
112
121
  # Store labels in a list accessible by the main thread
dcnum/write/writer.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import hashlib
2
2
  import json
3
3
  import pathlib
4
- from typing import List
4
+ from typing import Dict, List
5
5
  import warnings
6
6
 
7
7
  import h5py
@@ -17,9 +17,39 @@ class CreatingFileWithoutBasinWarning(UserWarning):
17
17
 
18
18
 
19
19
  class HDF5Writer:
20
- def __init__(self, path, mode="a", ds_kwds=None):
21
- """Write deformability cytometry HDF5 data"""
22
- self.h5 = h5py.File(path, mode=mode, libver="latest")
20
+ def __init__(self,
21
+ # TODO: make this a mandatory argument when `path` is
22
+ # properly removed
23
+ obj: h5py.File | pathlib.Path | str = None,
24
+ mode: str = "a",
25
+ ds_kwds: Dict = None,
26
+ path: pathlib.Path | str = None,
27
+ ):
28
+ """Write deformability cytometry HDF5 data
29
+
30
+ Parameters
31
+ ----------
32
+ obj: h5py.File | pathlib.Path | str
33
+ object to instantiate the writer from; If this is already
34
+ a :class:`h5py.File` object, then it is used, otherwise the
35
+ argument is passed to :class:`h5py.File`
36
+ mode: str
37
+ opening mode when using :class:`h5py.File`
38
+ ds_kwds: Dict
39
+ keyword arguments with which to initialize new Datasets
40
+ (e.g. compression)
41
+ """
42
+ if path is not None:
43
+ obj = path
44
+ warnings.warn("The `path` keyword argument is deprecated, use "
45
+ "`obj` instead",
46
+ DeprecationWarning)
47
+ if isinstance(obj, h5py.File):
48
+ self.h5 = obj
49
+ self.h5_owned = False
50
+ else:
51
+ self.h5 = h5py.File(obj, mode=mode, libver="latest")
52
+ self.h5_owned = True
23
53
  self.events = self.h5.require_group("events")
24
54
  ds_kwds = set_default_filter_kwargs(ds_kwds)
25
55
  self.ds_kwds = ds_kwds
@@ -31,7 +61,9 @@ class HDF5Writer:
31
61
  self.close()
32
62
 
33
63
  def close(self):
34
- self.h5.close()
64
+ self.h5.flush()
65
+ if self.h5_owned:
66
+ self.h5.close()
35
67
 
36
68
  @staticmethod
37
69
  def get_best_nd_chunks(item_shape, feat_dtype=np.float64):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dcnum
3
- Version: 0.17.1
3
+ Version: 0.18.0
4
4
  Summary: numerics toolbox for imaging deformability cytometry
5
5
  Author: Maximilian Schlögel, Paul Müller
6
6
  Maintainer-email: Paul Müller <dev@craban.de>
@@ -0,0 +1,48 @@
1
+ dcnum/__init__.py,sha256=hcawIKS7utYiOyVhOAX9t7K3xYzP1b9862VV0b6qSrQ,74
2
+ dcnum/_version.py,sha256=qQfZIFMnYUfFvdZIkQ7KTINCu5N5FVIhIaHGQZyIg1E,413
3
+ dcnum/feat/__init__.py,sha256=jUJYWTD3VIoDNKrmryXbjHb1rGwYtK4b7VPWihYgUoo,325
4
+ dcnum/feat/event_extractor_manager_thread.py,sha256=Ocid_t1awH6pOmurCmKYkC51XsXB0-DoN3fzjFDgE4c,7129
5
+ dcnum/feat/gate.py,sha256=svbObmqpYdqPawpfrsEjTiUPJXf24GrNi8PXTKT-z44,7225
6
+ dcnum/feat/queue_event_extractor.py,sha256=XhA930QVQ1Z4saisbcGTrEut-fSgwTyfDn6b9GzD4iY,15644
7
+ dcnum/feat/feat_background/__init__.py,sha256=OTmMuazHNaSrZb2XW4cnJ6PlgJLbKrPbaidpEixYa0A,341
8
+ dcnum/feat/feat_background/base.py,sha256=IYBFfsGXBfmFnZfD9QrmfrXbJtFSfVOS-v-u-uxSThs,7985
9
+ dcnum/feat/feat_background/bg_copy.py,sha256=muU-6eTUf3HTA2K2asrLWcR_hbRMjdygZROmjNXCm7Q,923
10
+ dcnum/feat/feat_background/bg_roll_median.py,sha256=G1atu6R8FWDe-Lblr1KcdP368Xx-kj6oy3q2mhljxB0,13064
11
+ dcnum/feat/feat_background/bg_sparse_median.py,sha256=-CShs4UAuZd00rACaXTZj3dccKevhcSGRsILFgMPLWo,20705
12
+ dcnum/feat/feat_brightness/__init__.py,sha256=o6AebVlmydwNgVF5kW6ITqJyFreoKrU3Ki_3EC8If-s,155
13
+ dcnum/feat/feat_brightness/bright_all.py,sha256=vf8xaYBdKD24hHUXdkI0_S7nbr7m49KW6gvuWvbHDVg,4545
14
+ dcnum/feat/feat_brightness/common.py,sha256=JX49EszYDmnvoOKXFVV1CalEIWRmOuY5EryNbqGbdac,156
15
+ dcnum/feat/feat_contour/__init__.py,sha256=Td4Hs47kUgJj0VXm3q5ofXhaUWr9QTfVgbwh5EELA-I,163
16
+ dcnum/feat/feat_contour/contour.py,sha256=_qyHCGvylVxruMWafvVbVOzhWGXLoFi10LReNxGcWhY,463
17
+ dcnum/feat/feat_contour/moments.py,sha256=W8sD2X7JqIBq-9nL82hf4Hm2uJkfca8EvAl_hqI_IDg,5109
18
+ dcnum/feat/feat_contour/volume.py,sha256=xVHWtv6USUHJZ5dM1Ur7fI7OwoPT5N2Ps0gKVWylfl8,6639
19
+ dcnum/feat/feat_texture/__init__.py,sha256=6StM9S540UVtdFFR3bHa7nfCTomeVdoo7Uy9CjuTgH0,137
20
+ dcnum/feat/feat_texture/common.py,sha256=COXHpXS-7DMouGu3WF83I76L02Sr7P9re4lxajh6g0E,439
21
+ dcnum/feat/feat_texture/tex_all.py,sha256=eGjjNfPpfZw7FA_VNFCIMiU38KD0qcGbxLciYy-tCiA,4097
22
+ dcnum/logic/__init__.py,sha256=7J3GrwJInNQbrLk61HRIV7X7p69TAIbMYpR34hh6u14,177
23
+ dcnum/logic/ctrl.py,sha256=dZlQBUhFrBOs5jkdtFX60g_1M_3A05kXqmCkWTTfyHk,27998
24
+ dcnum/logic/job.py,sha256=M0Q-Rfcm-zkTXTQc79W6YSNUjUlgmRPG0Ikbdn1aOpY,4608
25
+ dcnum/logic/json_encoder.py,sha256=cxMnqisbKEVf-rVcw6rK2BBAb6iz_hKFaGl81kK36lQ,571
26
+ dcnum/meta/__init__.py,sha256=AVqRgyKXO1orKnE305h88IBvoZ1oz6X11HN1WP5nGvg,60
27
+ dcnum/meta/paths.py,sha256=J_ikeHzd7gEeRgAKjuayz3x6q4h1fOiDadM-ZxhAGm4,1053
28
+ dcnum/meta/ppid.py,sha256=Q3jg8lZt5tlGIby_-7rBqTANesMjJrmxASXZhsvBD_Y,7706
29
+ dcnum/read/__init__.py,sha256=8uGj4YN7pDP4FO9TkZWXrpScwTLVWSEZexFq-TS9vsA,215
30
+ dcnum/read/cache.py,sha256=kC2Y9hXA92ARQ2Vgm1kBFCU-s6TPE1tPYvpzWI0aPow,5619
31
+ dcnum/read/const.py,sha256=8ih8rlWM7ntp8phrr9dh22hXXb210igSCatOSI9Ou30,463
32
+ dcnum/read/hdf5_data.py,sha256=sGqwaj3HpceSsctlVFty-3TRnWeN09WNfUh30xkt5b0,20598
33
+ dcnum/read/mapped.py,sha256=X__uqz5rT-N_xJhr6QsmsvXzIqu806piuTyjTHd_Ewg,2777
34
+ dcnum/segm/__init__.py,sha256=iiq_1A9DU5wMUcKnsZ53E7NyzCkbZCJeUDimzunE-OM,247
35
+ dcnum/segm/segm_thresh.py,sha256=lMf-lso_O_5Q5lJiiIQdYkM3zlj4uwNz9cNvLxVMeXc,1396
36
+ dcnum/segm/segmenter.py,sha256=gVzmP6CuwI9Qfk8GN_xWGu_xbtVTOhxIOWn-2yr_H1Y,12220
37
+ dcnum/segm/segmenter_cpu.py,sha256=IzhPNQaO4TBh3EzZqLGaBAeRryfBKnld7Joe8qY4AB4,10690
38
+ dcnum/segm/segmenter_gpu.py,sha256=Au1MQdAalVsmJ-cmb3OcCmEMBfXSDuJjdXJTGqEIcG8,1962
39
+ dcnum/segm/segmenter_manager_thread.py,sha256=xQEioOkASlm8DTdG0RBtjCJP1cOuiyJAm4q2n1l_tfM,5710
40
+ dcnum/write/__init__.py,sha256=Cpn3LqL18hh8OScUnGp_AnNfpWPpKW-oAJZH6ot7aRA,241
41
+ dcnum/write/deque_writer_thread.py,sha256=KpJ6po8JPlM696MITN-bhNnWQcy9E-qlhg9g-uzoPZg,1710
42
+ dcnum/write/queue_collector_thread.py,sha256=YQ6pvKNmCDf1C6HVx6gOA-q-FBoI6nkhOo-tAVYnyag,11906
43
+ dcnum/write/writer.py,sha256=nlJfQCPoW2Wze72y_256G4qmgYMdh5mL0vpvqg7lSaU,11728
44
+ dcnum-0.18.0.dist-info/LICENSE,sha256=YRChA1C8A2E-amJbudwMcbTCZy_HzmeY0hMIvduh1MM,1089
45
+ dcnum-0.18.0.dist-info/METADATA,sha256=Vnx_UzKsj2G9X16joXk6QOZWmDmvVmBgwXiuiGvK65o,2194
46
+ dcnum-0.18.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
47
+ dcnum-0.18.0.dist-info/top_level.txt,sha256=Hmh38rgG_MFTVDpUDGuO2HWTSq80P585Het4COQzFTg,6
48
+ dcnum-0.18.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,4 +0,0 @@
1
- # flake8: noqa: F401
2
- """Feature computation: OpenCV moments-based features"""
3
- from .mt_legacy import moments_based_features
4
-
@@ -1,46 +0,0 @@
1
- dcnum/__init__.py,sha256=hcawIKS7utYiOyVhOAX9t7K3xYzP1b9862VV0b6qSrQ,74
2
- dcnum/_version.py,sha256=_lgKa5p_bLODIZJPNplciMDP-zYDU8I4ZC5LbeKWQ08,413
3
- dcnum/feat/__init__.py,sha256=JqlgzOgDJhoTk8WVYcIiKTWq9EAM16_jGivzOtN6JGo,325
4
- dcnum/feat/event_extractor_manager_thread.py,sha256=Ocid_t1awH6pOmurCmKYkC51XsXB0-DoN3fzjFDgE4c,7129
5
- dcnum/feat/gate.py,sha256=svbObmqpYdqPawpfrsEjTiUPJXf24GrNi8PXTKT-z44,7225
6
- dcnum/feat/queue_event_extractor.py,sha256=3CIjZOwOD8JZZTgbE9_jC81B8lbNtVElSV371Q9zoSc,15005
7
- dcnum/feat/feat_background/__init__.py,sha256=OTmMuazHNaSrZb2XW4cnJ6PlgJLbKrPbaidpEixYa0A,341
8
- dcnum/feat/feat_background/base.py,sha256=DKcNSQOSi0cuo4zFbqtgDJnRiYDwoKkw2GQxpnK14fA,8119
9
- dcnum/feat/feat_background/bg_copy.py,sha256=EbeIy28gyPJr01Xens881IC1BtaTS5q-BkXPd3b6cLk,726
10
- dcnum/feat/feat_background/bg_roll_median.py,sha256=HgiGoyfLkygIlCoo8cBbf3gQt5uvM2S6_ez_V1hhCb4,12834
11
- dcnum/feat/feat_background/bg_sparse_median.py,sha256=LbWbDxAruGagidHt9wybyqkXp9OKi3eWXceujirpsqY,17608
12
- dcnum/feat/feat_brightness/__init__.py,sha256=o6AebVlmydwNgVF5kW6ITqJyFreoKrU3Ki_3EC8If-s,155
13
- dcnum/feat/feat_brightness/bright_all.py,sha256=Z5b-xkw7g7ejMpbGmdUqrxGRymqFhAQsZ938gaGXk9Y,3102
14
- dcnum/feat/feat_brightness/common.py,sha256=JX49EszYDmnvoOKXFVV1CalEIWRmOuY5EryNbqGbdac,156
15
- dcnum/feat/feat_moments/__init__.py,sha256=9eKmhBZGAZTLRnfCNHDiYM0a7qErrJCFLEgy3OlF9no,125
16
- dcnum/feat/feat_moments/ct_opencv.py,sha256=_qyHCGvylVxruMWafvVbVOzhWGXLoFi10LReNxGcWhY,463
17
- dcnum/feat/feat_moments/mt_legacy.py,sha256=tp85oeQ1GwVNdo6nXWhtbUGjMaXR8C6NMMWhobzThq0,4490
18
- dcnum/feat/feat_texture/__init__.py,sha256=6StM9S540UVtdFFR3bHa7nfCTomeVdoo7Uy9CjuTgH0,137
19
- dcnum/feat/feat_texture/common.py,sha256=COXHpXS-7DMouGu3WF83I76L02Sr7P9re4lxajh6g0E,439
20
- dcnum/feat/feat_texture/tex_all.py,sha256=eGjjNfPpfZw7FA_VNFCIMiU38KD0qcGbxLciYy-tCiA,4097
21
- dcnum/logic/__init__.py,sha256=7J3GrwJInNQbrLk61HRIV7X7p69TAIbMYpR34hh6u14,177
22
- dcnum/logic/ctrl.py,sha256=7m1HL_kO62d8Kt_o4gX3bhxbI4pwOhv3HWHRmbCaMp0,27022
23
- dcnum/logic/job.py,sha256=M0Q-Rfcm-zkTXTQc79W6YSNUjUlgmRPG0Ikbdn1aOpY,4608
24
- dcnum/logic/json_encoder.py,sha256=dy44ArmdnxpUfxxONmKdIv-fde3aTXPjZDN0HPATaxs,467
25
- dcnum/meta/__init__.py,sha256=AVqRgyKXO1orKnE305h88IBvoZ1oz6X11HN1WP5nGvg,60
26
- dcnum/meta/paths.py,sha256=J_ikeHzd7gEeRgAKjuayz3x6q4h1fOiDadM-ZxhAGm4,1053
27
- dcnum/meta/ppid.py,sha256=f3xT6k9EMhrmk2T_e-2LHE9qdXeGMZJcNOIIpr-_eb4,7706
28
- dcnum/read/__init__.py,sha256=iV2wrBMdwJgpXaphNiiAVybndDzTTv0CAGRNXyvxcLY,157
29
- dcnum/read/cache.py,sha256=HXbRFyTNT08_imv2460hMKVrfRrU6WnbJoO71HR1j8E,5800
30
- dcnum/read/const.py,sha256=ccME3dOK7DEXNhkTD90I7KF8zagzZufnbFkrYwQeIUo,307
31
- dcnum/read/hdf5_data.py,sha256=dO2VZKBA7bOOku37sdv5SJgZ8vbAGHd1k5cmcylEonQ,18169
32
- dcnum/segm/__init__.py,sha256=iiq_1A9DU5wMUcKnsZ53E7NyzCkbZCJeUDimzunE-OM,247
33
- dcnum/segm/segm_thresh.py,sha256=Z6buG3ia8uFJKTLE6BICM3n7Yw8IN-9f6_umIlx0xUk,1395
34
- dcnum/segm/segmenter.py,sha256=Y535ro4BTyE5Uj5lYIZ0xMbpKg2TIs5wCpv1Gg-yvTU,10625
35
- dcnum/segm/segmenter_cpu.py,sha256=tCY105rVr9_0RIq2618qnF1ueHRj7UtuK_nUBoAg-nY,10743
36
- dcnum/segm/segmenter_gpu.py,sha256=Au1MQdAalVsmJ-cmb3OcCmEMBfXSDuJjdXJTGqEIcG8,1962
37
- dcnum/segm/segmenter_manager_thread.py,sha256=2znDaKedSueomcU1pbHtFmVcGoHzp--sf494VgJF_Tk,5342
38
- dcnum/write/__init__.py,sha256=Cpn3LqL18hh8OScUnGp_AnNfpWPpKW-oAJZH6ot7aRA,241
39
- dcnum/write/deque_writer_thread.py,sha256=KpJ6po8JPlM696MITN-bhNnWQcy9E-qlhg9g-uzoPZg,1710
40
- dcnum/write/queue_collector_thread.py,sha256=YQ6pvKNmCDf1C6HVx6gOA-q-FBoI6nkhOo-tAVYnyag,11906
41
- dcnum/write/writer.py,sha256=QGYNda102f2_12YWXu5WEBEQaTXhNnuQ20g-Dej-cek,10535
42
- dcnum-0.17.1.dist-info/LICENSE,sha256=YRChA1C8A2E-amJbudwMcbTCZy_HzmeY0hMIvduh1MM,1089
43
- dcnum-0.17.1.dist-info/METADATA,sha256=RLo_EIVokUSP35TZP2lBr_FjfeLGwzj4UMamaU0HMGE,2194
44
- dcnum-0.17.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
45
- dcnum-0.17.1.dist-info/top_level.txt,sha256=Hmh38rgG_MFTVDpUDGuO2HWTSq80P585Het4COQzFTg,6
46
- dcnum-0.17.1.dist-info/RECORD,,