File size: 4,897 Bytes
b955224
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import colorsys
from sklearn.cluster import KMeans
import io

def rgb_to_hsv(rgb):
    """Convert RGB to HSV color space."""
    return colorsys.rgb_to_hsv(rgb[0]/255.0, rgb[1]/255.0, rgb[2]/255.0)

def classify_undertone(h, s, v):
    """
    Classify skin undertones based on HSV color space.
    This is a simplified approximation and should not be used for precise skin tone analysis.
    """
    if 0.05 <= h <= 0.15:  # Warm orange-yellow range
        return 'Warm'
    elif 0.55 <= h <= 0.75:  # Cool blue-purple range
        return 'Cool'
    else:
        return 'Neutral'

def classify_seasonal_type(h, s, v):
    """
    Classify seasonal color types based on HSV values.
    This is a highly simplified approximation.
    """
    if 0.05 <= h <= 0.15 and s > 0.5 and v > 0.5:
        return 'Spring'
    elif 0.15 <= h <= 0.35 and s < 0.5 and v > 0.5:
        return 'Summer'
    elif 0.35 <= h <= 0.55 and s > 0.5 and v > 0.5:
        return 'Autumn'
    elif (h <= 0.05 or h >= 0.75) and s < 0.3 and v < 0.5:
        return 'Winter'
    else:
        return 'Undefined'

def analyze_image_colors(img):
    """
    Analyze colors in an image, create visualizations, and perform clustering.
    """
    # Convert image to RGB if needed
    img = img.convert('RGB')
    
    # Convert image to numpy array
    img_array = np.array(img)
    
    # Reshape the image to be a list of pixels
    pixels = img_array.reshape(-1, 3)
    
    # Perform K-means clustering
    kmeans = KMeans(n_clusters=10, random_state=42)
    kmeans.fit(pixels)
    
    # Get cluster centers and labels
    colors = kmeans.cluster_centers_
    labels = kmeans.labels_
    
    # Convert RGB to HSV for further analysis
    hsv_colors = np.array([rgb_to_hsv(color) for color in colors])
    
    # Classify undertones and seasonal types
    undertones = [classify_undertone(h, s, v) for h, s, v in hsv_colors]
    seasonal_types = [classify_seasonal_type(h, s, v) for h, s, v in hsv_colors]
    
    # Visualizations
    plt.figure(figsize=(15, 10))
    
    # 1. Color Gradient Plot
    plt.subplot(2, 2, 1)
    luminance = np.dot(colors, [0.299, 0.587, 0.114])
    sorted_indices = np.argsort(luminance)
    sorted_colors = colors[sorted_indices] / 255.0
    
    plt.imshow(sorted_colors[np.newaxis, :], aspect='auto', extent=[0, 1, 0, 1])
    plt.title('Color Gradient (Sorted by Luminance)')
    plt.xlabel('Color Progression')
    plt.xticks([])
    plt.yticks([])
    
    # 2. Color Bar Plot
    plt.subplot(2, 2, 2)
    cluster_counts = np.unique(labels, return_counts=True)[1]
    plt.bar(range(len(colors)), cluster_counts, color=colors/255)
    plt.title('Color Distribution')
    plt.xlabel('Cluster')
    plt.ylabel('Pixel Count')
    
    # 3. Pie Chart of Undertones
    plt.subplot(2, 2, 3)
    undertone_counts = np.unique(undertones, return_counts=True)
    plt.pie(undertone_counts[1], labels=undertone_counts[0], autopct='%1.1f%%')
    plt.title('Undertone Distribution')
    
    # 4. Pie Chart of Seasonal Types
    plt.subplot(2, 2, 4)
    seasonal_counts = np.unique(seasonal_types, return_counts=True)
    plt.pie(seasonal_counts[1], labels=seasonal_counts[0], autopct='%1.1f%%')
    plt.title('Seasonal Type Distribution')
    
    plt.tight_layout()
    
    # Save plot to a buffer
    buf = io.BytesIO()
    plt.savefig(buf, format='png')
    buf.seek(0)
    plt.close()
    
    # Prepare color cluster details
    cluster_details = []
    for i, (color, undertone, season) in enumerate(zip(colors, undertones, seasonal_types)):
        cluster_details.append({
            'Cluster': i,
            'RGB Color': color,
            'Undertone': undertone,
            'Seasonal Type': season
        })
    
    return buf, cluster_details

def main():
    st.title('Image Color Analysis Tool')
    
    # File uploader
    uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
    
    if uploaded_file is not None:
        # Display the uploaded image
        image = Image.open(uploaded_file)
        st.image(image, caption='Uploaded Image', use_column_width=True)
        
        # Analyze colors
        st.write('Analyzing image colors...')
        plot_buffer, cluster_details = analyze_image_colors(image)
        
        # Display analysis plot
        st.image(plot_buffer, caption='Color Analysis Visualization')
        
        # Display cluster details
        st.subheader('Color Cluster Details')
        for cluster in cluster_details:
            st.write(f"**Cluster {cluster['Cluster']}:**")
            st.write(f"  - RGB Color: {cluster['RGB Color']}")
            st.write(f"  - Undertone: {cluster['Undertone']}")
            st.write(f"  - Seasonal Type: {cluster['Seasonal Type']}")

if __name__ == '__main__':
    main()