From 940efa5f52adc987b2809ed440ddb127d698999c Mon Sep 17 00:00:00 2001 From: iou1name Date: Sun, 10 Dec 2017 12:31:42 -0500 Subject: [PATCH] sorting imagebank before splitting into clusters --- mosiac.py | 50 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/mosiac.py b/mosiac.py index 151aa3f..cbf395c 100755 --- a/mosiac.py +++ b/mosiac.py @@ -6,18 +6,18 @@ Does mosiacs. import os import time import random +import colorsys import numpy as np from PIL import Image class Mosiac(): def __init__(self): - self.images = [] - self.means = [] self.imageBank = {} self.numClusters = 8 self.clusters = [] self.clusterMeans = [] + self.bigImageSize = None self.bigImage = None self.smallImage = None @@ -50,12 +50,15 @@ class Mosiac(): image = image.convert(image.palette.mode) if image.mode == "RGBA": image = alpha_composite_with_color(image).convert("RGB") + if image.mode == "L": + image = image.convert("RGB") # image = image.convert("RGBA") image = image.resize(self.tileSize, Image.ANTIALIAS) mean = tuple(np.mean(image, axis=(0,1))) # img = Image.new("RGBA", image.size) - # img.putdata(list(map(lambda pixel: (255,255,255,0) if pixel == (255,255,255,255) else pixel, image.getdata()))) + # img.putdata(list(map(lambda pixel: (255,255,255,0) if pixel == \ + # (255,255,255,255) else pixel, image.getdata()))) self.imageBank[mean] = image print(f"initImageBank took: {time.time()-then} seconds.") @@ -66,15 +69,12 @@ class Mosiac(): Create a bank of test images. """ then = time.time() - self.images = [] - self.means = [] for i in range(0, 257, 16): for j in range(0, 257, 16): for k in range(0, 257, 16): image = Image.new("RGB", self.tileSize, (i,j,k, 255)) - self.images.append(image) mean = tuple(np.mean(image, axis=(0,1))) - self.means.append(mean) + self.imageBank[mean] = image print(f"debugImageBank took: {time.time()-then} seconds.") @@ -87,8 +87,15 @@ class Mosiac(): num = len(sort) // self.numClusters for n in range(self.numClusters): - cluster = dict(0: pixel for pixel in sort[n*num:n*num+num]) - cluster + cluster = {pixel: self.imageBank[pixel] for pixel in \ + sort[n*num:n*num+num]} + self.clusters.append(cluster) + self.clusters[-1].update({pixel: self.imageBank[pixel] for pixel in \ + sort[-(len(sort) % num):]}) + + for cluster in self.clusters: + mean = tuple(np.mean(list(cluster.keys()), axis=(0))) + self.clusterMeans.append(mean) """ indexs = list(range(len(self.images))) step = len(self.images) // self.numClusters @@ -114,12 +121,19 @@ class Mosiac(): clusterMean = self.clusterMeans[dists.index(min(dists))] cluster = self.clusters[self.clusterMeans.index(clusterMean)] + nodes = np.array(list(cluster.keys())) + dist = np.sum((nodes - np.array(pixel))**2, axis=1) + # return np.argmin(dist) # closet value + dist.argsort()[:10] + return random.choice(list(dist)) + """ dists = [] - for n in cluster: - dist = np.linalg.norm(np.array(pixel)-np.array(self.means[n])) + for mean in cluster.keys(): + dist = np.linalg.norm(np.array(pixel)-np.array(mean)) dists.append(dist) - choice = random.choice(sorted(dists)[:10]) - return self.images[cluster[dists.index(choice)]] + """ + # choice = random.choice(sorted(dists)[:10]) + # return cluster[dists.index(choice)] def buildMatrix(self): @@ -158,7 +172,7 @@ class Mosiac(): def step (r,g,b, repetitions=1): - lum = math.sqrt( .241 * r + .691 * g + .068 * b ) + lum = ( .241 * r + .691 * g + .068 * b )**0.5 h, s, v = colorsys.rgb_to_hsv(r,g,b) @@ -228,8 +242,8 @@ if __name__ == "__main__": mosiac = Mosiac() mosiac.openBigImage(os.path.join(args.root, "big.jpg")) - # mosiac.initImageBank(**vars(args)) - mosiac.debugImageBank() + mosiac.initImageBank(**vars(args)) + # mosiac.debugImageBank() mosiac.initClusters() - # mosiac.buildMatrix() - # mosiac.buildMosiac(args.root) + mosiac.buildMatrix() + mosiac.buildMosiac(args.root)