TheEeeeLin's picture
update
f8cafb8
raw
history blame
2.78 kB
import cv2
import numpy as np
import os
import gradio as gr
class LutWhite:
CUBE64_ROWS = 8
CUBE64_SIZE = 64
CUBE256_SIZE = 256
CUBE_SCALE = CUBE256_SIZE // CUBE64_SIZE
def __init__(self, lut_image):
self.lut = self._create_lut(lut_image)
def _create_lut(self, lut_image):
reshape_lut = np.zeros(
(self.CUBE256_SIZE, self.CUBE256_SIZE, self.CUBE256_SIZE, 3), dtype=np.uint8
)
for i in range(self.CUBE64_SIZE):
tmp = i // self.CUBE64_ROWS
cx = (i % self.CUBE64_ROWS) * self.CUBE64_SIZE
cy = tmp * self.CUBE64_SIZE
cube64 = lut_image[cy : cy + self.CUBE64_SIZE, cx : cx + self.CUBE64_SIZE]
if cube64.size == 0:
continue
cube256 = cv2.resize(cube64, (self.CUBE256_SIZE, self.CUBE256_SIZE))
reshape_lut[i * self.CUBE_SCALE : (i + 1) * self.CUBE_SCALE] = cube256
return reshape_lut
def apply(self, src):
b, g, r = src[:, :, 0], src[:, :, 1], src[:, :, 2]
return self.lut[b, g, r]
class MakeWhiter:
def __init__(self, lut_image):
self.lut_white = LutWhite(lut_image)
def run(self, src: np.ndarray, strength: int) -> np.ndarray:
strength = np.clip(strength / 10.0, 0, 1)
if strength <= 0:
return src
img = self.lut_white.apply(src[:, :, :3])
return cv2.addWeighted(src[:, :, :3], 1 - strength, img, strength, 0)
base_dir = os.path.dirname(os.path.abspath(__file__))
default_lut = cv2.imread(os.path.join(base_dir, "lut/lut_origin.png"))
make_whiter = MakeWhiter(default_lut)
def make_whitening(image, strength):
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
iteration = strength // 10
bias = strength % 10
for i in range(iteration):
image = make_whiter.run(image, 10)
image = make_whiter.run(image, bias)
return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
def make_whitening_png(image, strength):
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGBA2BGRA)
b, g, r, a = cv2.split(image)
bgr_image = cv2.merge((b, g, r))
b_w, g_w, r_w = cv2.split(make_whiter.run(bgr_image, strength))
output_image = cv2.merge((b_w, g_w, r_w, a))
return cv2.cvtColor(output_image, cv2.COLOR_RGBA2BGRA)
# 启动Gradio应用
if __name__ == "__main__":
demo = gr.Interface(
fn=make_whitening,
inputs=[
gr.Image(type="pil", image_mode="RGBA", label="Input Image"),
gr.Slider(0, 30, step=1, label="Whitening Strength"),
],
outputs=gr.Image(type="pil"),
title="Image Whitening Demo",
description="Upload an image and adjust the whitening strength to see the effect.",
)
demo.launch()