This is a quick project I’ve had in my mind for a while now. I’ve drawing and painting on and off for about a decade now. My style and preferences have changed quite a bit over the years. I’ve often wondered if I have a “style” per se? I definitely love to try a bunch of different mediums and will never have a color coordinated Instagram grid. So, I was curious if I could take a look at the illustrations I’ve done over the last year and see what the colors look like and if I can use any machine learning techniques to find my “average palette.”

There are a few ways to go about this, but the general idea is that we first want to find a way to feed our method an image and it tells out of all colors in a picture which are the most prominent. For this particular example, we’ll be using an algorithm called K-Means. The general idea of this model is that it tries to group data points based on how similar they are to each other. We tell the model to arbitrarily pick K number of clusters, it’ll then find centroid for each cluster and try to assign data points to each one.

I’ll be using the OpenCV to read the images and scikit-learn for the K-Means method. I won’t be going over how to pick the correct number of K, you can search up the elbow method on your own time.


import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import PIL
from sklearn.cluster import KMeans
import matplotlib as mpl
mpl.rcParams['figure.dpi']= 300

def read_img(path):
    dim = (400, 600)
    img = cv.imread(path)
    img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
    # resize image
    img = cv.resize(img, dim, interpolation = cv.INTER_AREA)
    return img

img_1 = read_img("photos/1.jpeg")

Note that I am resizing all my images as they all must be the same size. Now, we can call our K-Means method and fit our model.


kmeans = KMeans(n_clusters=6)
img_fit = kmeans.fit(img_1.reshape(-1,3)) #reshape to 3 columns, RGB values
colors_img = img_fit.cluster_centers_

Note that we need to reshape the data to 3 columns for us to get the proper format for RGB values. The .cluster_centers_ method will then give us the cluster center (average value of color group) post model fitting.

See below a couple examples of the illustration and the average color groups corresponding to it. Swipe left and right to see color comparisons.

Color Centers vs. Illustration



Color Centers vs. Illustration

I repeated this exercise for about 30 different illustrations and then found the cluster of clusters. And this is the palette it came up with!

I mean, based on the examples above and looking into the colors I gravitate to… there are a lot of pinks and greens and bright colors, so I dig it?

Posted by:Aisha Pectyo

Astrophysicist turned data rockstar who speaks code and has enough yarn and mod podge to survive a zombie apocalypse.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s