Spaces:
Build error
Build error
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() |