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