Exemplo n.º 1
0
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
    )
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)