Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.95 KB | None | 0 0
  1. import numpy as np
  2. import math
  3. import random
  4. from scipy import misc
  5.  
  6. IMAGE = 'ball.jpg'
  7.  
  8. def pix_variance(x, y):
  9.     a = x[0] - y[0]
  10.     b = x[1] - y[1]
  11.     c = x[2] - y[2]
  12.     d = [a, b, c]
  13.     return (d)
  14.  
  15. def cluster_points(X, mu):
  16.     clusters  = {} #сюда с наименьшим расстоянием
  17.     for x in X:
  18.         bestmukey = min([(i[0], np.linalg.norm(pix_variance(x[0], mu[i[0]][0]))) \
  19.                     for i in enumerate(mu)], key=lambda t:t[1])[0]
  20.         try:
  21.             clusters[bestmukey].append(x)
  22.         except KeyError:
  23.             clusters[bestmukey] = [x]
  24.     #print("clusters =", clusters)
  25.     print()
  26.     print()
  27.     return clusters
  28.  
  29.  
  30. def reevaluate_centers(mu, clusters):
  31.     #все короче перекрашиваем
  32.     newmusplited = []
  33.     keys = sorted(clusters.keys())
  34.     for k in keys:
  35.         newmu = []
  36.         clusters_in_one = []
  37.         for j in clusters[k]:
  38.             clusters_in_one.append(np.array([j[0][0], j[0][1], j[0][2], j[1][0], j[1][1]]))
  39.         newmu.append(np.mean(clusters_in_one, axis=0))
  40.         newmusplited.append([[int(newmu[0][0]), int(newmu[0][1]), int(newmu[0][2])], [int(newmu[0][3]), int(newmu[0][4])]])
  41.     return newmusplited
  42.  
  43. def has_converged(mu, oldmu):
  44.     aa = set([tuple(a[0]) for a in mu])
  45.     ab = set([tuple(a[0]) for a in oldmu])
  46.     return (aa == ab)
  47.  
  48.  
  49. def find_centers(X, K):
  50.     oldmu = random.sample(X, K) #можно задать и специально
  51.     mu = random.sample(X, K)
  52.     print("oldmu :=", oldmu)
  53.     print("mu :=", mu)
  54.     #oldmu = pixels[80*240 - 50]
  55.     #mu = pixels[80*240 - 100]
  56.     while not has_converged(mu, oldmu):
  57.         oldmu = mu
  58.         print(mu)
  59.         print("*")
  60.         clusters = cluster_points(X, mu)
  61.         mu = reevaluate_centers(oldmu, clusters)
  62.     return(mu, clusters)
  63.  
  64.  
  65. def init_board(N):
  66.     X = np.array([(random.uniform(-1, 1), random.uniform(-1, 1)) for i in range(N)])
  67.     return X
  68.  
  69.      
  70.  
  71. def main():
  72.     for countK in range(2, 3): #два цвета
  73.         image = misc.imread(IMAGE)
  74.         dim_x, dim_y, colors = image.shape
  75.         print("Loaded image of shape {x}, {y}".format(x=dim_x, y=dim_y))
  76.         pixels = []
  77.  
  78.         for i in range(dim_x):
  79.             for j in range(dim_y):
  80.                 pixels.append([[image[i, j, 0], image[i, j, 1], image[i, j, 2]], [i, j]])
  81.  
  82.         res = find_centers(pixels, countK)
  83.         print(res[0][0][0])
  84.  
  85.         for k in range(0, len(res[0])):
  86.             for xy in res[1][k]:
  87.                 i = xy[1][0]
  88.                 j = xy[1][1]
  89.                 image[i, j, 0] = res[0][k][0][0]
  90.                 image[i, j, 1] = res[0][k][0][1]
  91.                 image[i, j, 2] = res[0][k][0][2]
  92.        
  93.         print("-------------------------")
  94.         print("Done for " + str(countK))
  95.         print("-------------------------")
  96.         misc.imsave(('outBall' + str(countK) + '.png'), image)
  97.  
  98.  
  99. if __name__ == '__main__':
  100.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement