77 lines
3.2 KiB
Python
77 lines
3.2 KiB
Python
from .hsv_helpers import get_value, set_value, get_saturation_hsv, add_value
|
|
from ..blend_modes_enum import BlendModes
|
|
from ..helpers import set_saturation
|
|
import torch
|
|
|
|
def hsv_value(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
blend_image_lightness = get_value(blend_image)
|
|
result = set_value(base_image, blend_image_lightness)
|
|
return result.clamp(0, 1)
|
|
|
|
def hsv_increase_value(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
blend_image_lightness = get_value(blend_image)
|
|
result = add_value(base_image, blend_image_lightness)
|
|
return result.clamp(0, 1)
|
|
|
|
def hsv_decrease_value(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
blend_image_lightness = get_value(blend_image) - 1
|
|
result = add_value(base_image, blend_image_lightness)
|
|
return result.clamp(0, 1)
|
|
|
|
def hsv_saturation(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
intensity = get_value(base_image)
|
|
saturation = get_saturation_hsv(blend_image)
|
|
result = set_saturation(base_image, saturation)
|
|
result = set_value(result, intensity)
|
|
return result.clamp(0, 1)
|
|
|
|
def hsv_increase_saturation(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
base_image_saturation = get_saturation_hsv(base_image)
|
|
blend_image_saturation = get_saturation_hsv(blend_image)
|
|
|
|
new_saturation = torch.lerp(base_image_saturation, torch.ones_like(base_image_saturation), blend_image_saturation)
|
|
|
|
base_image_lightness = get_value(base_image)
|
|
|
|
result = set_saturation(base_image, new_saturation)
|
|
result = set_value(result, base_image_lightness)
|
|
|
|
return result.clamp(0, 1)
|
|
|
|
def hsv_decrease_saturation(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
base_image_saturation = get_saturation_hsv(base_image)
|
|
blend_image_saturation = get_saturation_hsv(blend_image)
|
|
|
|
new_saturation = torch.lerp(torch.zeros_like(base_image_saturation), base_image_saturation, blend_image_saturation)
|
|
|
|
base_image_lightness = get_value(base_image)
|
|
|
|
result = set_saturation(base_image, new_saturation)
|
|
result = set_value(result, base_image_lightness)
|
|
|
|
return result.clamp(0, 1)
|
|
|
|
def hsv_color(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
base_image_intensity = get_value(base_image)
|
|
result = set_value(blend_image, base_image_intensity)
|
|
return result.clamp(0, 1)
|
|
|
|
def hsv_hue(base_image: torch.Tensor, blend_image: torch.Tensor) -> torch.Tensor:
|
|
base_image_saturation = get_saturation_hsv(base_image)
|
|
base_image_lightness = get_value(base_image)
|
|
|
|
result = blend_image.clone()
|
|
result = set_saturation(result, base_image_saturation)
|
|
result = set_value(result, base_image_lightness)
|
|
return result.clamp(0, 1)
|
|
|
|
hsv_blend_functions = {
|
|
BlendModes.HSV_COLOR: hsv_color,
|
|
BlendModes.HSV_HUE: hsv_hue,
|
|
BlendModes.HSV_SATURATION: hsv_saturation,
|
|
BlendModes.HSV_VALUE: hsv_value,
|
|
BlendModes.HSV_DECREASE_SATURATION: hsv_decrease_saturation,
|
|
BlendModes.HSV_INCREASE_SATURATION: hsv_increase_saturation,
|
|
BlendModes.HSV_DECREASE_VALUE: hsv_decrease_value,
|
|
BlendModes.HSV_INCREASE_VALUE: hsv_increase_value,
|
|
} |