Source code for pyntcloud.scalar_fields.rgb

import numpy as np
from .base import ScalarField


class RGBScalarField(ScalarField):
    def extract_info(self):
        self.rgb = self.pyntcloud.points[[
            "red", "green", "blue"]].values.astype("f")


[docs]class RGBIntensity(RGBScalarField): """ Red, green and blue intensity. """ def compute(self): rgb_i = np.nan_to_num( self.rgb / np.sum(self.rgb, axis=1, keepdims=True)) self.to_be_added["Ri"] = rgb_i[:, 0] self.to_be_added["Gi"] = rgb_i[:, 1] self.to_be_added["Bi"] = rgb_i[:, 2]
[docs]class RelativeLuminance(RGBScalarField): """ Similar to grayscale. Computed following Wikipedia. """ def compute(self): self.rgb /= 255. coefficients = np.array([0.2125, 0.7154, 0.0721]) self.to_be_added["relative_luminance"] = np.einsum( 'ij, j', self.rgb, coefficients)
[docs]class HueSaturationValue(RGBScalarField): """ Hue, Saturation, Value colorspace. """ def compute(self): rgb = self.rgb MAX = np.max(rgb, -1) MIN = np.min(rgb, -1) MAX_MIN = np.ptp(rgb, -1) H = np.empty_like(MAX) idx = rgb[:, 0] == MAX H[idx] = 60 * (rgb[idx, 1] - rgb[idx, 2]) / MAX_MIN[idx] H[np.logical_and(idx, rgb[:, 1] < rgb[:, 2])] += 360 idx = rgb[:, 1] == MAX H[idx] = (60 * (rgb[idx, 2] - rgb[idx, 0]) / MAX_MIN[idx]) + 120 idx = rgb[:, 2] == MAX H[idx] = (60 * (rgb[idx, 0] - rgb[idx, 1]) / MAX_MIN[idx]) + 240 self.to_be_added["H"] = np.nan_to_num(H) self.to_be_added["S"] = np.nan_to_num( np.where(MAX == 0, 0, 1 - (MIN / MAX))) self.to_be_added["V"] = np.nan_to_num(MAX / 255 * 100)