|
import numpy as np |
|
import cv2 |
|
from PIL import Image |
|
from skimage.color import rgb2lab |
|
from skimage.color import lab2rgb |
|
from sklearn.cluster import KMeans |
|
|
|
|
|
def count_high_freq_colors(image): |
|
im = image.getcolors(maxcolors=1024*1024) |
|
sorted_colors = sorted(im, key=lambda x: x[0], reverse=True) |
|
|
|
freqs = [c[0] for c in sorted_colors] |
|
mean_freq = sum(freqs) / len(freqs) |
|
|
|
high_freq_colors = [c for c in sorted_colors if c[0] > max(2, mean_freq*1.25)] |
|
return high_freq_colors |
|
|
|
def get_high_freq_colors(image, similarity_threshold=30): |
|
image_copy = image.copy() |
|
high_freq_colors = count_high_freq_colors(image) |
|
|
|
for i, (freq1, color1) in enumerate(high_freq_colors): |
|
for j, (freq2, color2) in enumerate(high_freq_colors): |
|
if (color_distance(color1, color2) < similarity_threshold) or (color_distance(color1, opaque_color_on_white(color2, 0.5)) < 5): |
|
if(freq2 > freq1): |
|
replace_color(image_copy, color1, color2) |
|
|
|
high_freq_colors = count_high_freq_colors(image_copy) |
|
print(high_freq_colors) |
|
return [high_freq_colors, image_copy] |
|
|
|
def color_quantization(image, color_frequency_list): |
|
|
|
color_values = [color for _, color in color_frequency_list] |
|
|
|
|
|
mask = np.ones(image.shape[:2], dtype=bool) |
|
for color in color_values: |
|
color_mask = np.all(image == color, axis=2) |
|
mask = np.logical_and(mask, np.logical_not(color_mask)) |
|
image[mask] = (255, 255, 255) |
|
|
|
return image |
|
|
|
def create_binary_matrix(img_arr, target_color): |
|
|
|
mask = np.all(img_arr == target_color, axis=-1) |
|
|
|
|
|
binary_matrix = mask.astype(int) |
|
from datetime import datetime |
|
binary_file_name = f'mask-{datetime.now().timestamp()}.png' |
|
cv2.imwrite(binary_file_name, binary_matrix * 255) |
|
|
|
|
|
return binary_file_name |
|
|
|
def color_distance(color1, color2): |
|
return sum((a - b) ** 2 for a, b in zip(color1, color2)) ** 0.5 |
|
|
|
def replace_color(image, old_color, new_color): |
|
pixels = image.load() |
|
width, height = image.size |
|
for x in range(width): |
|
for y in range(height): |
|
if pixels[x, y] == old_color: |
|
pixels[x, y] = new_color |
|
|
|
def opaque_color_on_white(color, a): |
|
r, g, b = color |
|
opaque_red = int((1 - a) * 255 + a * r) |
|
opaque_green = int((1 - a) * 255 + a * g) |
|
opaque_blue = int((1 - a) * 255 + a * b) |
|
return (opaque_red, opaque_green, opaque_blue) |