33 lines
1.1 KiB
Python
33 lines
1.1 KiB
Python
from .ImageManipulation import ImageManipulation
|
|
from ImageContainer import ImageContainer
|
|
from typing import Any, List
|
|
from utils.image_utils import pil_to_cv2, cv2_to_pil
|
|
import cv2
|
|
import numpy as np
|
|
|
|
|
|
class HueShift(ImageManipulation):
|
|
def getManipulationName(self) -> str:
|
|
return "Hue Shift"
|
|
|
|
def getParameters(self) -> List[str]:
|
|
return ["hue"]
|
|
|
|
def manipulateImage(self, image: ImageContainer, parameters: Any) -> None:
|
|
if image is None or image.getImage() is None:
|
|
return
|
|
pil_img = image.getImage()
|
|
cv_img = pil_to_cv2(pil_img)
|
|
hsv = cv2.cvtColor(cv_img, cv2.COLOR_BGR2HSV).astype(np.uint8)
|
|
hue_delta = 50
|
|
if isinstance(parameters, dict) and parameters.get("hue") is not None:
|
|
hue_delta = int(parameters.get("hue"))
|
|
h, s, v = cv2.split(hsv)
|
|
# OpenCV H range is [0,179]; wrap around using modulo
|
|
h = ((h.astype(np.int16) + hue_delta) % 180).astype(np.uint8)
|
|
hsv_shifted = cv2.merge([h, s, v])
|
|
bgr = cv2.cvtColor(hsv_shifted, cv2.COLOR_HSV2BGR)
|
|
image._imageData = cv2_to_pil(bgr)
|
|
|
|
|