Task: K-means segmenation of color image

Write a python script/function, that realizes color segmentation of and image using the k-means method. Use the image 'bricks.png' from the data section.

The algorithm:

  1. initialize k random seeds - color etalons (three-dimensional RGB vectors)
  2. assign every pixel to one of the etalons (minimal euclidean distance in RGB space)
  3. recompute every etalon as a mean of all assigned pixels
  4. compute the change of every etalon (euclidean distance between the last and current one)
  • if the change of every etalon is bellow threshold, or max. number of iterations reached, terminate
  • otherwise repeat from step 2

Use k=5, max. iterations=100, change threshold 0.0001 (when pixel colors are in range 0-1).

Example results

In [2]:
%run task_kmeans
k_means: iteration: 1 change: 0.8485006
k_means: iteration: 2 change: 0.19751547
k_means: iteration: 3 change: 0.07778725
k_means: iteration: 4 change: 0.1312725
k_means: iteration: 5 change: 0.14691395
k_means: iteration: 6 change: 0.10606986
k_means: iteration: 7 change: 0.12432985
k_means: iteration: 8 change: 0.14905393
k_means: iteration: 9 change: 0.03143411
k_means: iteration: 10 change: 0.014125211
k_means: iteration: 11 change: 0.009480108
k_means: iteration: 12 change: 0.0069304146
k_means: iteration: 13 change: 0.0050471663
k_means: iteration: 14 change: 0.00440278
k_means: iteration: 15 change: 0.0036926686
k_means: iteration: 16 change: 0.0036431197
k_means: iteration: 17 change: 0.00390675
k_means: iteration: 18 change: 0.0044749784
k_means: iteration: 19 change: 0.005214949
k_means: iteration: 20 change: 0.0057368684
k_means: iteration: 21 change: 0.007670785
k_means: iteration: 22 change: 0.010690429
k_means: iteration: 23 change: 0.013953084
k_means: iteration: 24 change: 0.017898092
k_means: iteration: 25 change: 0.021144705
k_means: iteration: 26 change: 0.019533195
k_means: iteration: 27 change: 0.013751459
k_means: iteration: 28 change: 0.008371034
k_means: iteration: 29 change: 0.0046725157
k_means: iteration: 30 change: 0.0019678383
k_means: iteration: 31 change: 0.00091827504
k_means: iteration: 32 change: 0.00024352313
k_means: iteration: 33 change: 0.00024355383
k_means: iteration: 34 change: 8.003091e-05
k_means terminated: minimum change reached.
In [ ]: