Skip to content

01-Kmeans-Color-Quantization

Updated
17 Sept 2026
1 min read
2 sections
Page 100 of 117
Python & Machine Learning

K Means Color Quantization

Imports

The Image

python
image_as_array = mpimg.imread('../DATA/palm_trees.jpg')
python
image_as_array # RGB CODES FOR EACH PIXEL
Out · result
array([[[ 25,  89, 127],
        [ 25,  89, 127],
        [ 25,  89, 127],
        ...,
        [ 23,  63,  98],
44 more lines
        [ 51,  91, 127],
        [ 50,  90, 126]],

       [[ 25,  89, 127],
        [ 25,  89, 127],
        [ 25,  89, 127],
        ...,
        [ 31,  71, 106],
        [ 48,  88, 124],
        [ 47,  90, 125]],

       [[ 25,  89, 127],
        [ 25,  89, 127],
        [ 25,  89, 127],
        ...,
        [ 39,  79, 114],
        [ 42,  85, 120],
        [ 44,  88, 123]],

       ...,

       [[  4,   4,   6],
        [  4,   4,   6],
        [  4,   4,   6],
        ...,
        [  9,   9,  11],
        [  9,   9,  11],
        [  9,   9,  11]],

       [[  3,   3,   5],
        [  3,   3,   5],
        [  3,   3,   5],
        ...,
        [  8,   8,  10],
        [  8,   8,  10],
        [  8,   8,  10]],

       [[  4,   4,   6],
        [  4,   4,   6],
        [  4,   4,   6],
        ...,
        [  9,   9,  11],
        [ 10,  10,  12],
        [ 10,  10,  12]]], dtype=uint8)
python
plt.figure(figsize=(6,6),dpi=200)
plt.imshow(image_as_array)
Out · result
<matplotlib.image.AxesImage at 0x16d48ff0eb0>
Out · plot
Output 1

Using Kmeans to Quantize Colors

Quantizing colors means we'll reduce the number of unique colors here to K unique colors. Let's try just 6 colors!

python
image_as_array.shape
# (h,w,3 color channels)
Out · result
(1401, 934, 3)

Convert from 3d to 2d

Kmeans is designed to train on 2D data (data rows and feature columns), so we can reshape the above strip by using (h,w,c) ---> (h * w,c)

python
(h,w,c) = image_as_array.shape
python
image_as_array2d = image_as_array.reshape(h*w,c)
python
from sklearn.cluster import KMeans
python
model = KMeans(n_clusters=6)
python
model
Out · result
KMeans(n_clusters=6)
python
labels = model.fit_predict(image_as_array2d)
python
labels
Out · result
array([3, 3, 3, ..., 0, 0, 0])
python
# THESE ARE THE 6 RGB COLOR CODES!
model.cluster_centers_
Out · result
array([[  2.78511649,   2.58768262,   3.70018933],
       [138.48117295, 144.26702702, 143.36832053],
       [193.42381114, 154.48097123, 107.32286981],
       [ 71.66897867, 109.55660624, 137.71325107],
       [219.38959087, 134.67545907,  45.42786667],
1 more line
       [ 67.69383456,  61.88876822,  62.08150368]])
python
rgb_codes = model.cluster_centers_.round(0).astype(int)
python
rgb_codes
Out · result
array([[  3,   3,   4],
       [138, 144, 143],
       [193, 154, 107],
       [ 72, 110, 138],
       [219, 135,  45],
1 more line
       [ 68,  62,  62]])
python
quantized_image = np.reshape(rgb_codes[labels], (h, w, c))
python
quantized_image
Out · result
array([[[ 72, 110, 138],
        [ 72, 110, 138],
        [ 72, 110, 138],
        ...,
        [ 68,  62,  62],
44 more lines
        [ 72, 110, 138],
        [ 72, 110, 138]],

       [[ 72, 110, 138],
        [ 72, 110, 138],
        [ 72, 110, 138],
        ...,
        [ 68,  62,  62],
        [ 72, 110, 138],
        [ 72, 110, 138]],

       [[ 72, 110, 138],
        [ 72, 110, 138],
        [ 72, 110, 138],
        ...,
        [ 72, 110, 138],
        [ 72, 110, 138],
        [ 72, 110, 138]],

       ...,

       [[  3,   3,   4],
        [  3,   3,   4],
        [  3,   3,   4],
        ...,
        [  3,   3,   4],
        [  3,   3,   4],
        [  3,   3,   4]],

       [[  3,   3,   4],
        [  3,   3,   4],
        [  3,   3,   4],
        ...,
        [  3,   3,   4],
        [  3,   3,   4],
        [  3,   3,   4]],

       [[  3,   3,   4],
        [  3,   3,   4],
        [  3,   3,   4],
        ...,
        [  3,   3,   4],
        [  3,   3,   4],
        [  3,   3,   4]]])
python
plt.figure(figsize=(6,6),dpi=200)
plt.imshow(quantized_image)
Out · result
<matplotlib.image.AxesImage at 0x16d5bd928b0>
Out · plot
Output 2