Spaces:
Running
Running
""" | |
@author: cuny | |
@file: MakeWhiter.py | |
@time: 2022/7/2 14:28 | |
@description: | |
美白算法 | |
""" | |
import os | |
import cv2 | |
import math | |
import numpy as np | |
local_path = os.path.dirname(__file__) | |
class MakeWhiter(object): | |
class __LutWhite: | |
""" | |
美白的内部类 | |
""" | |
def __init__(self, lut): | |
cube64rows = 8 | |
cube64size = 64 | |
cube256size = 256 | |
cubeScale = int(cube256size / cube64size) # 4 | |
reshapeLut = np.zeros((cube256size, cube256size, cube256size, 3)) | |
for i in range(cube64size): | |
tmp = math.floor(i / cube64rows) | |
cx = int((i - tmp * cube64rows) * cube64size) | |
cy = int(tmp * cube64size) | |
cube64 = lut[cy:cy + cube64size, cx:cx + cube64size] # cube64 in lut(512*512 (512=8*64)) | |
_rows, _cols, _ = cube64.shape | |
if _rows == 0 or _cols == 0: | |
continue | |
cube256 = cv2.resize(cube64, (cube256size, cube256size)) | |
i = i * cubeScale | |
for k in range(cubeScale): | |
reshapeLut[i + k] = cube256 | |
self.lut = reshapeLut | |
def imageInLut(self, src): | |
arr = src.copy() | |
bs = arr[:, :, 0] | |
gs = arr[:, :, 1] | |
rs = arr[:, :, 2] | |
arr[:, :] = self.lut[bs, gs, rs] | |
return arr | |
def __init__(self, lutImage: np.ndarray = None): | |
self.__lutWhiten = None | |
if lutImage is not None: | |
self.__lutWhiten = self.__LutWhite(lutImage) | |
def setLut(self, lutImage: np.ndarray): | |
self.__lutWhiten = self.__LutWhite(lutImage) | |
def generate_identify_color_matrix(size: int = 512, channel: int = 3) -> np.ndarray: | |
""" | |
用于生成一张初始的查找表 | |
Args: | |
size: 查找表尺寸,默认为512 | |
channel: 查找表通道数,默认为3 | |
Returns: | |
返回生成的查找表图像 | |
""" | |
img = np.zeros((size, size, channel), dtype=np.uint8) | |
for by in range(size // 64): | |
for bx in range(size // 64): | |
for g in range(64): | |
for r in range(64): | |
x = r + bx * 64 | |
y = g + by * 64 | |
img[y][x][0] = int(r * 255.0 / 63.0 + 0.5) | |
img[y][x][1] = int(g * 255.0 / 63.0 + 0.5) | |
img[y][x][2] = int((bx + by * 8.0) * 255.0 / 63.0 + 0.5) | |
return cv2.cvtColor(img, cv2.COLOR_RGB2BGR).clip(0, 255).astype('uint8') | |
def run(self, src: np.ndarray, strength: int) -> np.ndarray: | |
""" | |
美白图像 | |
Args: | |
src: 原图 | |
strength: 美白强度,0 - 10 | |
Returns: | |
美白后的图像 | |
""" | |
dst = src.copy() | |
strength = min(10, int(strength)) / 10. | |
if strength <= 0: | |
return dst | |
self.setLut(cv2.imread(f"{local_path}/lut_image/3.png", -1)) | |
_, _, c = src.shape | |
img = self.__lutWhiten.imageInLut(src[:, :, :3]) | |
dst[:, :, :3] = cv2.addWeighted(src[:, :, :3], 1 - strength, img, strength, 0) | |
return dst | |
if __name__ == "__main__": | |
# makeLut = MakeWhiter() | |
# cv2.imwrite("lutOrigin.png", makeLut.generate_identify_color_matrix()) | |
input_image = cv2.imread("test_image/7.jpg", -1) | |
lut_image = cv2.imread("lut_image/3.png") | |
makeWhiter = MakeWhiter(lut_image) | |
output_image = makeWhiter.run(input_image, 10) | |
cv2.imwrite("makeWhiterCompare.png", np.hstack((input_image, output_image))) | |