import cv2
import numpy as np
from sklearn.cluster import KMeans
from tkinter import Tk, filedialog
from PIL import Image
import matplotlib.pyplot as plt
def rgb_to_hex(rgb):
"""Convert RGB tuple to HEX string."""
return "#{:02x}{:02x}{:02x}".format(int(rgb[0]), int(rgb[1]), int(rgb[2]))
def extract_colors(image_path, num_colors=6):
"""Extract dominant colors from an image using KMeans clustering."""
# Read and convert image
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Reshape image data for clustering
pixels = image.reshape((-1, 3))
pixels = np.float32(pixels)
# Apply K-Means
kmeans = KMeans(n_clusters=num_colors, random_state=42)
kmeans.fit(pixels)
colors = np.round(kmeans.cluster_centers_).astype(int)
return colors
def display_palette(colors):
"""Display color palette using matplotlib."""
plt.figure(figsize=(10, 2))
plt.axis("off")
# Create palette blocks
for i, color in enumerate(colors):
plt.subplot(1, len(colors), i + 1)
plt.imshow(np.ones((100, 100, 3), dtype=np.uint8) * np.uint8(color))
plt.title(rgb_to_hex(color), fontsize=10)
plt.axis("off")
plt.tight_layout()
plt.show()
def main():
# GUI File Picker
root = Tk()
root.withdraw()
image_path = filedialog.askopenfilename(title="Select an Image",
filetypes=[("Image Files", "*.jpg *.jpeg *.png *.bmp")])
if not image_path:
print("❌ No file selected.")
return
print(f"šø Analyzing: {image_path}")
colors = extract_colors(image_path, num_colors=6)
print("\nšØ Dominant Colors:")
for color in colors:
print(f"RGB: {tuple(color)} | HEX: {rgb_to_hex(color)}")
# Show palette visually
display_palette(colors)
if __name__ == "__main__":
main()
No comments:
Post a Comment