def function_rgb( red_data_and_metadata: DataAndMetadata.DataAndMetadata, green_data_and_metadata: DataAndMetadata.DataAndMetadata, blue_data_and_metadata: DataAndMetadata.DataAndMetadata ) -> typing.Optional[DataAndMetadata.DataAndMetadata]: red_data_and_metadata = DataAndMetadata.promote_ndarray( red_data_and_metadata) green_data_and_metadata = DataAndMetadata.promote_ndarray( green_data_and_metadata) blue_data_and_metadata = DataAndMetadata.promote_ndarray( blue_data_and_metadata) shape = tuple( DataAndMetadata.determine_shape(red_data_and_metadata, green_data_and_metadata, blue_data_and_metadata)) red_data_and_metadata = DataAndMetadata.promote_constant( red_data_and_metadata, shape) green_data_and_metadata = DataAndMetadata.promote_constant( green_data_and_metadata, shape) blue_data_and_metadata = DataAndMetadata.promote_constant( blue_data_and_metadata, shape) def calculate_data(): rgb_image = numpy.empty(shape + (3, ), numpy.uint8) channels = (blue_data_and_metadata, green_data_and_metadata, red_data_and_metadata) for channel_index, channel in enumerate(channels): data = channel.data if not Image.is_data_valid(data): return None if tuple(data.shape) != shape: return None if data.dtype.kind in 'iu': rgb_image[..., channel_index] = numpy.clip(data, 0, 255) elif data.dtype.kind in 'f': rgb_image[..., channel_index] = numpy.clip( numpy.multiply(data, 255), 0, 255) else: return None return rgb_image if green_data_and_metadata.data_shape != shape or blue_data_and_metadata.data_shape != shape: return None return DataAndMetadata.new_data_and_metadata( calculate_data(), intensity_calibration=red_data_and_metadata.intensity_calibration, dimensional_calibrations=red_data_and_metadata.dimensional_calibrations )
def function_rgb_linear_combine( data_and_metadata_in: _DataAndMetadataLike, red_weight: float, green_weight: float, blue_weight: float) -> DataAndMetadata.DataAndMetadata: data_and_metadata = DataAndMetadata.promote_ndarray(data_and_metadata_in) data = data_and_metadata.data if not Image.is_data_valid(data): raise ValueError("RGB linear combine: invalid data.") if not data_and_metadata.is_data_rgb_type: raise ValueError("RGB linear combine: data is not RGB type.") assert data is not None combined_data: _ImageDataType if Image.is_shape_and_dtype_rgb(data.shape, data.dtype): combined_data = numpy.sum( data[..., :] * (blue_weight, green_weight, red_weight), 2) elif Image.is_shape_and_dtype_rgba(data.shape, data.dtype): combined_data = numpy.sum( data[..., :] * (blue_weight, green_weight, red_weight, 0.0), 2) else: raise ValueError("RGB channel: unable to extract channel.") return DataAndMetadata.new_data_and_metadata( combined_data, intensity_calibration=data_and_metadata.intensity_calibration, dimensional_calibrations=data_and_metadata.dimensional_calibrations)
def function_rgb_channel(data_and_metadata_in: _DataAndMetadataLike, channel: int) -> DataAndMetadata.DataAndMetadata: data_and_metadata = DataAndMetadata.promote_ndarray(data_and_metadata_in) if channel < 0 or channel > 3: raise ValueError("RGB channel: invalid channel.") data = data_and_metadata.data if not Image.is_data_valid(data): raise ValueError("RGB channel: invalid data.") if not data_and_metadata.is_data_rgb_type: raise ValueError("RGB channel: data is not RGB type.") assert data is not None channel_data: _ImageDataType if Image.is_shape_and_dtype_rgb(data.shape, data.dtype): if channel == 3: channel_data = numpy.ones(data.shape, int) else: channel_data = data[..., channel].astype(int) elif Image.is_shape_and_dtype_rgba(data.shape, data.dtype): channel_data = data[..., channel].astype(int) else: raise ValueError("RGB channel: unable to extract channel.") return DataAndMetadata.new_data_and_metadata( channel_data, intensity_calibration=data_and_metadata.intensity_calibration, dimensional_calibrations=data_and_metadata.dimensional_calibrations)
def function_rgb_linear_combine( data_and_metadata: DataAndMetadata.DataAndMetadata, red_weight: float, green_weight: float, blue_weight: float ) -> typing.Optional[DataAndMetadata.DataAndMetadata]: data_and_metadata = DataAndMetadata.promote_ndarray(data_and_metadata) def calculate_data(): data = data_and_metadata.data if not Image.is_data_valid(data): return None if Image.is_shape_and_dtype_rgb(data.shape, data.dtype): return numpy.sum( data[..., :] * (blue_weight, green_weight, red_weight), 2) elif Image.is_shape_and_dtype_rgba(data.shape, data.dtype): return numpy.sum( data[..., :] * (blue_weight, green_weight, red_weight, 0.0), 2) else: return None if not data_and_metadata.is_data_rgb_type: return None return DataAndMetadata.new_data_and_metadata( calculate_data(), intensity_calibration=data_and_metadata.intensity_calibration, dimensional_calibrations=data_and_metadata.dimensional_calibrations)
def function_rgb_channel( data_and_metadata: DataAndMetadata.DataAndMetadata, channel: int) -> typing.Optional[DataAndMetadata.DataAndMetadata]: data_and_metadata = DataAndMetadata.promote_ndarray(data_and_metadata) def calculate_data(): data = data_and_metadata.data if channel < 0 or channel > 3: return None if not Image.is_data_valid(data): return None if Image.is_shape_and_dtype_rgb(data.shape, data.dtype): if channel == 3: return numpy.ones(data.shape, int) return data[..., channel].astype(int) elif Image.is_shape_and_dtype_rgba(data.shape, data.dtype): return data[..., channel].astype(int) else: return None if not data_and_metadata.is_data_rgb_type: return None return DataAndMetadata.new_data_and_metadata( calculate_data(), intensity_calibration=data_and_metadata.intensity_calibration, dimensional_calibrations=data_and_metadata.dimensional_calibrations)