import cv2 import numpy as np def color_transfer(source, target): # Convert the images from RGB to L*a*b* color space source_lab = cv2.cvtColor(source, cv2.COLOR_BGR2Lab) target_lab = cv2.cvtColor(target, cv2.COLOR_BGR2Lab) # Split the LAB image into L, A and B channels source_l, source_a, source_b = cv2.split(source_lab) target_l, target_a, target_b = cv2.split(target_lab) # Compute mean and standard deviation for each channel in both images l_mean_src, l_std_src, = source_l.mean(), source_l.std() a_mean_src, a_std_src = source_a.mean(), source_a.std() b_mean_src, b_std_src = source_b.mean(), source_b.std() l_mean_tar, l_std_tar = target_l.mean(), target_l.std() a_mean_tar, a_std_tar = target_a.mean(), target_a.std() b_mean_tar, b_std_tar = target_b.mean(), target_b.std() # Perform the color transfer l_result = (source_l - l_mean_src) * (l_std_tar / l_std_src) + l_mean_tar a_result = (source_a - a_mean_src) * (a_std_tar / a_std_src) + a_mean_tar b_result = (source_b - b_mean_src) * (b_std_tar / b_std_src) + b_mean_tar # Clip and reshape the channels l_result = np.clip(l_result, 0, 255).astype(np.uint8) a_result = np.clip(a_result, 0, 255).astype(np.uint8) b_result = np.clip(b_result, 0, 255).astype(np.uint8) # Merge the channels back result_lab = cv2.merge([l_result, a_result, b_result]) # Convert the resulting image from L*a*b* to RGB color space result = cv2.cvtColor(result_lab, cv2.COLOR_Lab2BGR) return result def create_target_image(hex_colors): # Convert hex colors to RGB rgb_colors = [tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) for hex_color in hex_colors] # Create an image with the RGB colors target_image = np.zeros((100, len(rgb_colors), 3), dtype=np.uint8) for i, rgb_color in enumerate(rgb_colors): target_image[:, i] = rgb_color return target_image # # Load source and target images # source_img = cv2.imread("estampa.jpg") # target_img = cv2.imread("cor.jpg") # hex_colors = ['ff0000', '00ff00', '0000ff'] # Example hex colors # target_img = create_target_image(hex_colors) # image_bytes = io.BytesIO(source_img) # image_np = np.array(image) # # Perform color transfer # transferred_img = color_transfer(source_img, target_img) # # Return the transferred image for visualization # cv2.imwrite("result.jpg", transferred_img) def recolor(image_np, colors): colors = [color.replace('#', '') for color in colors] target_img = create_target_image(colors) source_bgr = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR) transferred_img = color_transfer(source_bgr, target_img) cv2.imwrite("result.jpg", transferred_img) return transferred_img