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" ]