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):