clicker-clicker2/color_analysis.py
2025-03-30 15:16:32 -04:00

155 lines
4.5 KiB
Python

#!/usr/bin/env python3
from PIL import Image
import numpy as np
import os
from collections import Counter
import colorsys
def rgb_to_hex(rgb):
return '#{:02x}{:02x}{:02x}'.format(rgb[0], rgb[1], rgb[2])
def get_dominant_colors(image_path, num_colors=5):
# Open image and convert to RGB
img = Image.open(image_path).convert('RGB')
# Resize image to make processing faster
img = img.resize((100, 100))
# Get colors
pixels = np.array(img)
pixels = pixels.reshape(-1, 3)
# Count most common colors
count = Counter(map(tuple, pixels))
most_common = count.most_common(num_colors)
# Convert to hex
return [rgb_to_hex(color) for color, count in most_common]
def get_color_stats(hex_color):
# Convert hex to RGB
h = hex_color.lstrip('#')
r, g, b = tuple(int(h[i:i+2], 16) for i in (0, 2, 4))
# Convert RGB to HSV
h, s, v = colorsys.rgb_to_hsv(r/255, g/255, b/255)
# Determine if color is dark or light
is_dark = v < 0.5
# Determine if color is vibrant
is_vibrant = s > 0.5 and v > 0.5
# Determine basic color category
if s < 0.15:
if v < 0.15:
category = "black"
elif v > 0.85:
category = "white"
else:
category = "gray"
else:
if h < 0.05 or h > 0.95:
category = "red"
elif 0.05 <= h < 0.15:
category = "orange"
elif 0.15 <= h < 0.25:
category = "yellow"
elif 0.25 <= h < 0.5:
category = "green"
elif 0.5 <= h < 0.65:
category = "cyan"
elif 0.65 <= h < 0.75:
category = "blue"
elif 0.75 <= h < 0.95:
category = "purple"
return {
"hex": hex_color,
"rgb": (r, g, b),
"hsv": (h*360, s*100, v*100),
"is_dark": is_dark,
"is_vibrant": is_vibrant,
"category": category
}
def analyze_assets(directory):
assets = []
# Find all PNG files
for file in os.listdir(directory):
if file.endswith('.png'):
assets.append(os.path.join(directory, file))
# Get color data
color_data = {}
all_colors = []
for asset in assets:
name = os.path.basename(asset)
dominant_colors = get_dominant_colors(asset)
color_data[name] = dominant_colors
all_colors.extend(dominant_colors)
# Count most common colors across all assets
color_counter = Counter(all_colors)
most_common_colors = color_counter.most_common(10)
# Get stats for most common colors
color_stats = [get_color_stats(color) for color, _ in most_common_colors]
# Find primary and accent colors
primary_colors = []
accent_colors = []
for stat in color_stats:
if stat["category"] not in ["black", "white", "gray"]:
if stat["is_vibrant"]:
accent_colors.append(stat)
else:
primary_colors.append(stat)
# Find background colors (darker colors)
background_colors = [stat for stat in color_stats if stat["is_dark"]]
return {
"individual_assets": color_data,
"most_common_colors": [color for color, _ in most_common_colors],
"color_stats": color_stats,
"primary_colors": primary_colors[:3],
"accent_colors": accent_colors[:3],
"background_colors": background_colors[:3]
}
if __name__ == "__main__":
assets_dir = "/home/billy/code/viber/src/assets"
results = analyze_assets(assets_dir)
print("Color Analysis Results:\n")
print("Most Common Colors:")
for color in results["most_common_colors"]:
print(f" {color}")
print("\nPrimary Colors:")
for color in results["primary_colors"]:
print(f" {color['hex']} - {color['category']}")
print("\nAccent Colors:")
for color in results["accent_colors"]:
print(f" {color['hex']} - {color['category']}")
print("\nBackground Colors:")
for color in results["background_colors"]:
print(f" {color['hex']} - {color['category']}")
print("\nDetailed Color Stats:")
for i, stat in enumerate(results["color_stats"][:5]):
print(f"Color {i+1}:")
print(f" Hex: {stat['hex']}")
print(f" RGB: {stat['rgb']}")
print(f" HSV: {stat['hsv']}")
print(f" Category: {stat['category']}")
print(f" Dark: {stat['is_dark']}")
print(f" Vibrant: {stat['is_vibrant']}")
print("")