Spaces:
Runtime error
Runtime error
File size: 3,626 Bytes
52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c 397c2d2 52cbb9c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
import numpy as np
import cv2
from PIL import Image
def color_transfer(source, target):
source = cv2.cvtColor(source, cv2.COLOR_BGR2Lab).astype("float32")
target = cv2.cvtColor(target, cv2.COLOR_BGR2Lab).astype("float32")
lMeanSrc, aMeanSrc, bMeanSrc = (source[..., i].mean() for i in range(3))
lStdSrc, aStdSrc, bStdSrc = (source[..., i].std() for i in range(3))
lMeanTar, aMeanTar, bMeanTar = (target[..., i].mean() for i in range(3))
lStdTar, aStdTar, bStdTar = (target[..., i].std() for i in range(3))
(l, a, b) = cv2.split(source)
l -= lMeanSrc
a -= aMeanSrc
b -= bMeanSrc
l = (lStdTar / lStdSrc) * l
a = (aStdTar / aStdSrc) * a
b = (bStdTar / bStdSrc) * b
l += lMeanTar
a += aMeanTar
b += bMeanTar
l = np.clip(l, 0, 255)
a = np.clip(a, 0, 255)
b = np.clip(b, 0, 255)
transfer = cv2.merge([l, a, b])
transfer = cv2.cvtColor(transfer.astype("uint8"), cv2.COLOR_Lab2BGR)
return transfer
def hex_to_rgb(hex_val):
hex_val = hex_val.lstrip('#')
return tuple(int(hex_val[i:i+2], 16) for i in (0, 2, 4))
def create_color_palette(colors, palette_width=800, palette_height=200):
pixels = []
n_colors = len(colors)
for i in range(n_colors):
color = hex_to_rgb(colors[i])
for j in range(palette_width//n_colors * palette_height):
pixels.append(color)
img = Image.new('RGB', (palette_height, palette_width))
img.putdata(pixels)
return img
def recolor_statistical(source, colors):
pallete_img = create_color_palette(colors)
palette_bgr = cv2.cvtColor(np.array(pallete_img), cv2.COLOR_RGB2BGR)
recolored = color_transfer(source, palette_bgr)
# Adjust bilateral filtering parameters
diameter = 15
sigma_color = 30
sigma_space = 20
smoothed = cv2.bilateralFilter(recolored, diameter, sigma_color, sigma_space)
# Save image at maximum quality
filename = "result.jpg"
cv2.imwrite(filename, smoothed, [cv2.IMWRITE_JPEG_QUALITY, 100])
return filename
# Usage
# source_img = cv2.imread("path_to_your_source_image.jpg")
# hexcolors = ["#db5a1e", "#555115", "#9a690e", "#1f3a19", "#da8007",
# "#9a0633", "#b70406", "#d01b4b", "#e20b0f", "#f7515d"]
# result_path = recolor_statistical(source_img, hexcolors)
def recolor(source, colors):
# pallete_img = create_color_palette(colors)
# palette_bgr = cv2.cvtColor(np.array(pallete_img), cv2.COLOR_RGB2BGR)
# recolored = optimal_transport_color_transfer(source, palette_bgr)
# smooth = True#test with true for different results.
# if smooth:
# # Apply bilateral filtering
# diameter = 10 # diameter of each pixel neighborhood, adjust based on your image size
# sigma_color = 25 # larger value means colors farther to each other will mix together
# sigma_space = 15 # larger values means farther pixels will influence each other if their colors are close enough
# smoothed = cv2.bilateralFilter(recolored, diameter, sigma_color, sigma_space)
# recoloredFile = cv2.imwrite("result.jpg", smoothed, [cv2.IMWRITE_JPEG_QUALITY, 100])
# return recoloredFile
# else:
# recoloredFile = cv2.imwrite("result.jpg", recolored)
# return recoloredFile
source = source.astype(np.uint8)
source = cv2.cvtColor(source, cv2.COLOR_RGB2BGR)
source_img = source
hexcolors = ["#db5a1e", "#555115", "#9a690e", "#1f3a19", "#da8007",
"#9a0633", "#b70406", "#d01b4b", "#e20b0f", "#f7515d"]
result_path = recolor_statistical(source_img, colors)
|