def __get_spec(self, array_key): info = self.__get_info(array_key) roi_min = info['Extended']['MinPoint'] if roi_min is not None: roi_min = Coordinate(roi_min[::-1]) roi_max = info['Extended']['MaxPoint'] if roi_max is not None: roi_max = Coordinate(roi_max[::-1]) data_roi = Roi(offset=roi_min, shape=(roi_max - roi_min)) data_dims = Coordinate(data_roi.get_shape()) if self.ndims is None: self.ndims = len(data_dims) else: assert self.ndims == len(data_dims) if array_key in self.array_specs: spec = self.array_specs[array_key].copy() else: spec = ArraySpec() if spec.voxel_size is None: spec.voxel_size = Coordinate(info['Extended']['VoxelSize']) if spec.roi is None: spec.roi = data_roi * spec.voxel_size data_dtype = dvision.DVIDDataInstance(self.hostname, self.port, self.uuid, self.datasets[array_key]).dtype if spec.dtype is not None: assert spec.dtype == data_dtype, ( "dtype %s provided in array_specs for %s, " "but differs from instance %s dtype %s" % (self.array_specs[array_key].dtype, array_key, self.datasets[array_key], data_dtype)) else: spec.dtype = data_dtype if spec.interpolatable is None: spec.interpolatable = spec.dtype in [ np.float, np.float32, np.float64, np.float128, np.uint8 # assuming this is not used for labels ] logger.warning( "WARNING: You didn't set 'interpolatable' for %s. " "Based on the dtype %s, it has been set to %s. " "This might not be what you want.", array_key, spec.dtype, spec.interpolatable) return spec
def process(self, batch, request): points = batch.points[self.points] mask = self.settings.mask voxel_size = self.spec[self.array].voxel_size # get roi used for creating the new array (points_roi does no # necessarily align with voxel size) enlarged_vol_roi = points.spec.roi.snap_to_grid(voxel_size) offset = enlarged_vol_roi.get_begin() / voxel_size shape = enlarged_vol_roi.get_shape() / voxel_size data_roi = Roi(offset, shape) logger.debug("Points in %s", points.spec.roi) for i, point in points.data.items(): logger.debug("%d, %s", i, point.location) logger.debug("Data roi in voxels: %s", data_roi) logger.debug("Data roi in world units: %s", data_roi*voxel_size) if len(points.data.items()) == 0: # If there are no points at all, just create an empty matrix. rasterized_points_data = np.zeros(data_roi.get_shape(), dtype=self.spec[self.array].dtype) elif mask is not None: mask_array = batch.arrays[mask].crop(enlarged_vol_roi) # get those component labels in the mask, that contain points labels = [] for i, point in points.data.items(): v = Coordinate(point.location / voxel_size) v -= data_roi.get_begin() labels.append(mask_array.data[v]) # Make list unique labels = list(set(labels)) # zero label should be ignored if 0 in labels: labels.remove(0) if len(labels) == 0: logger.debug("Points and provided object mask do not overlap. No points to rasterize.") rasterized_points_data = np.zeros(data_roi.get_shape(), dtype=self.spec[self.array].dtype) else: # create data for the whole points ROI, "or"ed together over # individual object masks rasterized_points_data = np.sum( [ self.__rasterize( points, data_roi, voxel_size, self.spec[self.array].dtype, self.settings, Array(data=mask_array.data==label, spec=mask_array.spec)) for label in labels ], axis=0) else: # create data for the whole points ROI without mask rasterized_points_data = self.__rasterize( points, data_roi, voxel_size, self.spec[self.array].dtype, self.settings) # fix bg/fg labelling if requested if (self.settings.bg_value != 0 or self.settings.fg_value != 1): replaced = replace( rasterized_points_data, [0, 1], [self.settings.bg_value, self.settings.fg_value]) rasterized_points_data = replaced.astype(self.spec[self.array].dtype) # create array and crop it to requested roi spec = self.spec[self.array].copy() spec.roi = data_roi*voxel_size rasterized_points = Array( data=rasterized_points_data, spec=spec) batch.arrays[self.array] = rasterized_points.crop(request[self.array].roi) # restore requested ROI of points if self.points in request: request_roi = request[self.points].roi points.spec.roi = request_roi points.data = {i: p for i, p in points.data.items() if request_roi.contains(p.location)} # restore requested mask if mask is not None: batch.arrays[mask] = batch.arrays[mask].crop(request[mask].roi)