diff --git a/kmeans.py b/kmeans.py
index 423fc9390998542bfeb427bd82a1ead3ccd75f56..a2daa6a901114a15ea7f70ab9d2287c5f8c8b0ec 100644
--- a/kmeans.py
+++ b/kmeans.py
@@ -22,7 +22,12 @@ def compute_means(clusters):
             This means, that ``len(retVal) == len(clusters)`` must hold after
             calling this function!
     """
-    pass # TODO
+    result = []
+    # TODO
+    for pixels in clusters:
+        result.append(imgutils.color_average(pixels))
+    return result
+
 
 
 def compute_clusters(pixels, means):
@@ -54,7 +59,23 @@ def compute_clusters(pixels, means):
             **IMPORTANT**: It must hold, that your return value is of the same
             length as ``means``!
     """
-    pass # TODO
+    # TODO
+    clusters = []
+    for _ in means:
+        clusters.append([])
+
+    for pixel in pixels:
+        r, g, b, x, y = pixel
+        distances = []
+        for mean in means:
+            distance = np.linalg.norm(np.array([r, g, b]) - np.array(mean)) ** 2
+            distances.append(distance)
+        
+        closest_mean_index = np.argmin(distances)
+        clusters[closest_mean_index].append(pixel)
+
+    return clusters
+
 
 
 def averaged_pixels(clusters, means):
@@ -74,7 +95,17 @@ def averaged_pixels(clusters, means):
             been replaced with the respective color of the mean value.
     """
     assert(len(clusters) == len(means))
-    pass # TODO
+    # TODO
+    averaged_pixels = []
+    for i in range(len(clusters)):
+        cluster = clusters[i]
+        mean = means[i]
+        averaged_cluster = []
+        for pixel in cluster:
+            averaged_pixel = (mean[0], mean[1], mean[2], pixel[3], pixel[4])
+            averaged_cluster.append(averaged_pixel)
+        averaged_pixels.extend(averaged_cluster)
+    return averaged_pixels
 
 
 def kmeans(image, k):