def get(self, image, sample, objective, **kwargs): # Grab properties from the objective to pass to the sample new_kwargs = objective.properties.current_value_dict() new_kwargs.update(kwargs) kwargs = new_kwargs list_of_scatterers = sample.resolve(**kwargs) if not isinstance(list_of_scatterers, list): list_of_scatterers = [list_of_scatterers] sample_volume, limits = _create_volume(list_of_scatterers, **kwargs) sample_volume = Image(sample_volume) for scatterer in list_of_scatterers: sample_volume.merge_properties_from(scatterer) imaged_sample = objective.resolve(sample_volume, limits=limits, **kwargs) # Merge with input if not image: return imaged_sample if not isinstance(image, list): image = [image] for i in range(len(image)): image[i].merge_properties_from(imaged_sample) return image
def get(self, images, axis, features, **kwargs): if features is not None: images = [feature.resolve() for feature in features] result = Image(np.mean(images, axis=axis)) for image in images: result.merge_properties_from(image) return result
def get(self, image, sample, objective, **kwargs): # Grab properties from the objective to pass to the sample new_kwargs = objective.properties.current_value_dict(**kwargs) new_kwargs.update(kwargs) kwargs = new_kwargs list_of_scatterers = sample.resolve(**kwargs) if not isinstance(list_of_scatterers, list): list_of_scatterers = [list_of_scatterers] volume_samples = [ scatterer for scatterer in list_of_scatterers if not scatterer.get_property("is_field", default=False) ] field_samples = [ scatterer for scatterer in list_of_scatterers if scatterer.get_property("is_field", default=False) ] sample_volume, limits = _create_volume(volume_samples, **kwargs) sample_volume = Image(sample_volume) for scatterer in volume_samples + field_samples: sample_volume.merge_properties_from(scatterer) imaged_sample = objective.resolve( sample_volume, limits=limits, fields=field_samples, **kwargs ) upscale = kwargs["upscale"] shape = imaged_sample.shape if upscale > 1: mean_imaged_sample = np.reshape( imaged_sample, (shape[0] // upscale, upscale, shape[1] // upscale, upscale, shape[2]), ).mean(axis=(3, 1)) imaged_sample = Image(mean_imaged_sample).merge_properties_from( imaged_sample ) # Merge with input if not image: return imaged_sample if not isinstance(image, list): image = [image] for i in range(len(image)): image[i].merge_properties_from(imaged_sample) return image
def get(self, image, scale, translate, rotate, shear, **kwargs): assert ( image.ndim == 2 or image.ndim == 3 ), "Affine only supports 2-dimensional or 3-dimension inputs." dx, dy = translate fx, fy = scale cr = np.cos(rotate) sr = np.sin(rotate) k = np.tan(shear) scale_map = np.array([[1 / fx, 0], [0, 1 / fy]]) rotation_map = np.array([[cr, sr], [-sr, cr]]) shear_map = np.array([[1, 0], [-k, 1]]) mapping = scale_map @ rotation_map @ shear_map shape = image.shape center = np.array(shape[:2]) / 2 d = center - np.dot(mapping, center) - np.array([dy, dx]) # Clean up kwargs kwargs.pop("input", False) kwargs.pop("matrix", False) kwargs.pop("offset", False) kwargs.pop("output", False) # Call affine_transform if image.ndim == 2: new_image = utils.safe_call( ndimage.affine_transform, input=image, matrix=mapping, offset=d, **kwargs ) new_image = Image(new_image) new_image.merge_properties_from(image) image = new_image elif image.ndim == 3: for z in range(shape[-1]): image[:, :, z] = utils.safe_call( ndimage.affine_transform, input=image[:, :, z], matrix=mapping, offset=d, **kwargs ) # Map positions inverse_mapping = np.linalg.inv(mapping) for prop in image.properties: if "position" in prop: position = np.array(prop["position"]) prop["position"] = np.array( ( *( ( inverse_mapping @ (position[:2] - center + np.array([dy, dx])) + center ) ), *position[3:], ) ) return image
def _process_and_get(self, images, **kwargs): if isinstance(images, list) and len(images) != 1: list_of_labels = super()._process_and_get(images, **kwargs) else: if isinstance(images, list): images = images[0] list_of_labels = [] for prop in images.properties: if "position" in prop: inp = Image(np.array(images)) inp.append(prop) out = Image(self.get(inp, **kwargs)) out.merge_properties_from(inp) list_of_labels.append(out) output_region = kwargs["output_region"] output = np.zeros( (output_region[2], output_region[3], kwargs["number_of_masks"]) ) for label in list_of_labels: positions = _get_position(label) for position in positions: p0 = np.round(position - output_region[0:2]) if np.any(p0 > output.shape[0:2]) or np.any(p0 + label.shape[0:2] < 0): continue crop_x = int(-np.min([p0[0], 0])) crop_y = int(-np.min([p0[1], 0])) crop_x_end = int( label.shape[0] - np.max([p0[0] + label.shape[0] - output.shape[0], 0]) ) crop_y_end = int( label.shape[1] - np.max([p0[1] + label.shape[1] - output.shape[1], 0]) ) labelarg = label[crop_x:crop_x_end, crop_y:crop_y_end, :] p0[0] = np.max([p0[0], 0]) p0[1] = np.max([p0[1], 0]) p0 = p0.astype(np.int) output_slice = output[ p0[0] : p0[0] + labelarg.shape[0], p0[1] : p0[1] + labelarg.shape[1] ] for label_index in range(kwargs["number_of_masks"]): if isinstance(kwargs["merge_method"], list): merge = kwargs["merge_method"][label_index] else: merge = kwargs["merge_method"] if merge == "add": output[ p0[0] : p0[0] + labelarg.shape[0], p0[1] : p0[1] + labelarg.shape[1], label_index, ] += labelarg[..., label_index] elif merge == "overwrite": output_slice[ labelarg[..., label_index] != 0, label_index ] = labelarg[labelarg[..., label_index] != 0, label_index] output[ p0[0] : p0[0] + labelarg.shape[0], p0[1] : p0[1] + labelarg.shape[1], label_index, ] = output_slice[..., label_index] elif merge == "or": output[ p0[0] : p0[0] + labelarg.shape[0], p0[1] : p0[1] + labelarg.shape[1], label_index, ] = (output_slice[..., label_index] != 0) | ( labelarg[..., label_index] != 0 ) elif merge == "mul": output[ p0[0] : p0[0] + labelarg.shape[0], p0[1] : p0[1] + labelarg.shape[1], label_index, ] *= labelarg[..., label_index] else: # No match, assume function output[ p0[0] : p0[0] + labelarg.shape[0], p0[1] : p0[1] + labelarg.shape[1], label_index, ] = merge( output_slice[..., label_index], labelarg[..., label_index] ) output = Image(output) for label in list_of_labels: output.merge_properties_from(label) return output