DRAPEa / utils /color_analyzer.py
andevs's picture
Upload 18 files
9c1053c verified
Raw
History Blame Contribute Delete
2.96 kB
import numpy as np
from sklearn.cluster import KMeans
import colorsys
class ColorAnalyzer:
def __init__(self):
self.seasonal_palettes = {
'spring': ['#FF6B6B', '#FFE66D', '#4ECDC4', '#95E77E'],
'summer': ['#C7B9FF', '#FF99CC', '#66CCFF', '#99FF99'],
'fall': ['#8B4513', '#D2691E', '#B8860B', '#CD853F'],
'winter': ['#1a1a1a', '#333333', '#4d4d4d', '#666666']
}
def analyze(self, image: np.ndarray) -> dict:
pixels = image.reshape(-1, 3)
kmeans = KMeans(n_clusters=5, random_state=42, n_init=10)
kmeans.fit(pixels)
dominant_colors = kmeans.cluster_centers_.astype(int).tolist()
dominant_colors_hex = [self._rgb_to_hex(color) for color in dominant_colors]
palette = self._generate_palette(dominant_colors_hex)
harmony_score = self._calculate_harmony(dominant_colors_hex)
seasonal_match = self._match_season(dominant_colors_hex)
return {
"dominant_colors": dominant_colors_hex[:3],
"palette": palette[:5],
"harmony_score": harmony_score,
"seasonal_match": seasonal_match,
"recommendations": self._get_recommendations(dominant_colors_hex)
}
def _rgb_to_hex(self, rgb):
return '#{:02x}{:02x}{:02x}'.format(int(rgb[0]), int(rgb[1]), int(rgb[2]))
def _generate_palette(self, colors):
palette = colors.copy()
while len(palette) < 5:
palette.append('#CCCCCC')
return palette
def _calculate_harmony(self, colors):
if len(colors) < 2:
return 0.7
color_values = []
for color in colors[:3]:
r = int(color[1:3], 16) / 255
g = int(color[3:5], 16) / 255
b = int(color[5:7], 16) / 255
h, s, v = colorsys.rgb_to_hsv(r, g, b)
color_values.append(h)
if len(color_values) >= 2:
differences = [abs(color_values[i] - color_values[i-1]) for i in range(1, len(color_values))]
avg_diff = sum(differences) / len(differences)
harmony = min(1.0, avg_diff * 2)
return round(harmony, 2)
return 0.7
def _match_season(self, colors):
if not colors:
return 'spring'
hex_values = [int(c[1:], 16) for c in colors[:3]]
avg_hex = sum(hex_values) / len(hex_values)
if avg_hex < 0x666666:
return 'winter'
elif avg_hex < 0x999999:
return 'fall'
elif avg_hex < 0xCCCCCC:
return 'spring'
else:
return 'summer'
def _get_recommendations(self, colors):
return [
"Pair with neutral accessories",
"Consider the occasion when choosing colors",
"Mix textures to add depth"
]