Advertisement
Guest User

Untitled

a guest
Oct 26th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.92 KB | None | 0 0
  1. import numpy as np
  2. from PIL import Image
  3. from math import sqrt
  4.  
  5.  
  6. def split_img(pic, x, y):
  7.     blocks = []
  8.     bit_map = np.array(list(pic.getdata())).reshape(x, y)
  9.     for r in range(0, x, 4):
  10.         for c in range(0, y, 4):
  11.             blocks.append(bit_map[r:r + 4, c:c + 4])
  12.     return blocks
  13.  
  14.  
  15. def calculate_average_vector(blocks):
  16.     average = sum(blocks)/len(blocks)
  17.     return np.array(np.around(average, decimals=0), dtype=np.int64)
  18.  
  19.  
  20. def split_code_book(initial, k, e):
  21.     last_code_book = initial
  22.     for i in range(k-1):
  23.         if i == 0:
  24.             new_code_book = np.vstack((last_code_book - e, last_code_book + e))
  25.             new_code_book = np.vsplit(new_code_book, i + 2)
  26.             temp_code_book = last_code_book
  27.             last_code_book = new_code_book
  28.         else:
  29.             if i == 1:
  30.                 new_code_book = np.vstack((last_code_book[0] - e, temp_code_book, last_code_book[-1] + e))
  31.             else:
  32.                 new_code_book = np.vstack((last_code_book[0] - e))
  33.                 for x in range(len(temp_code_book)):
  34.                     new_code_book = np.vstack((new_code_book, temp_code_book[x]))
  35.                 new_code_book = np.vstack((new_code_book, last_code_book[-1] + e))
  36.             new_code_book = np.vsplit(new_code_book, i + 2)
  37.             temp_code_book = last_code_book
  38.             last_code_book = new_code_book
  39.     return(new_code_book)
  40.  
  41.  
  42. def initiate_distance(blocks, code_book):
  43.     distance_table = []
  44.  
  45.     for x in range(len(blocks)):  # distance from each vector to each entry codeBook
  46.         for y in range(len(code_book)):
  47.             distance_table.append(euclid_distance(blocks[x], code_book[y]))
  48.     distance_table = (np.array(distance_table).reshape(len(blocks), len(code_book)))
  49.     distance_list = []
  50.     for x in range(len(distance_table)):  # index - vector, value - entry codeBook
  51.         distance_list.append(np.nonzero(distance_table[x] == distance_table[x].min())[0][0])
  52.     return distance_list
  53.  
  54.  
  55. def code_book_checker(code_book, distance_list):
  56.     x = 0
  57.     while x in range(len(code_book)):
  58.         if not distance_list.count(x):
  59.             code_book.pop(x)
  60.             for y in range(len(distance_list)):
  61.                 if int(distance_list[y]) > x:
  62.                     distance_list[y] -= 1
  63.             x -= 1
  64.         x += 1
  65.     return code_book
  66.  
  67.  
  68. def create_clusters(blocks, distance_list, code_book):
  69.     clusters_list = [[] for x in range(len(code_book))]
  70.     for x in range(len(distance_list)):
  71.         clusters_list[distance_list[x]].append(blocks[x])
  72.     return clusters_list
  73.  
  74.  
  75. def calculate_distance(blocks, code_book):
  76.     temp_distance = []
  77.     new_distance = []
  78.     for x in range(len(code_book)):
  79.         for y in range(len(blocks[x])):
  80.             temp_distance.append(euclid_distance(code_book[x], blocks[x][y]))
  81.         new_distance.append(temp_distance)
  82.         temp_distance = []
  83.     return new_distance
  84.  
  85.  
  86. def modify_code_book(average_distance, clusters, code_book):
  87.     old_average_distance = average_distance
  88.     for i in range(len(code_book)):
  89.         code_book[i] = calculate_average_vector(clusters[i])
  90.     print('кодовая книга\n', code_book)
  91.     print()
  92.     print()
  93.     blocks = []
  94.     for i in range(len(clusters)):
  95.         for j in range(len(clusters[i])):
  96.             blocks.append(clusters[i][j])
  97.     print('блоки\n', blocks)
  98.     distance = initiate_distance(blocks, code_book)
  99.  
  100.     code_book = code_book_checker(code_book, distance)
  101.     clusters = create_clusters(blocks, distance, code_book)
  102.     new_distance = calculate_distance(clusters, code_book)
  103.     average_distance_list = []
  104.     for i in range(len(np.array(new_distance))):
  105.         average_distance_list.append(np.average(np.array(new_distance)[i]))
  106.     average_distance = np.average(np.array(average_distance_list))
  107.     return(old_average_distance, average_distance, code_book, clusters, distance)
  108.  
  109.  
  110. def print_clusters(clusters, code_book):
  111.     for i in range(len(code_book)):
  112.         print('%s кластер:' % i)
  113.         for j in range(len(clusters[i])):
  114.             print(clusters[i][j])
  115.         print()
  116.  
  117.  
  118. def euclid_distance(vector, entry_code_book):
  119.     result = 0
  120.     for x in range(len(vector)):
  121.         for y in range(len(vector)):
  122.             result += (vector[y][x] - entry_code_book[y][x])**2
  123.     return sqrt(result)
  124. # codeBookSize = int(input('codeBookSize:'))
  125. # eps = int(input('eps:'))
  126.  
  127. codeBookSize = 128
  128. eps = 1
  129. D = 0.005
  130. fileName = 'img.bmp'
  131. img = Image.open(fileName)
  132. width, height = img.size[0], img.size[1]
  133. widthVectors, heightVectors = int(width/4), int(height/4)
  134.  
  135. vectors = split_img(img, width, height)  # split pic
  136. codeBook = split_code_book(calculate_average_vector(vectors), codeBookSize, eps)  # initial codebook
  137. distance = initiate_distance(vectors, codeBook)  # make clusters
  138. print('В инициализированной кодовой книге %s элементов' % len(codeBook))
  139. print('Инициализированная кодовая книга:', codeBook, sep='\n', end='\n\n')
  140. codeBook = code_book_checker(codeBook, distance)  # check codebook
  141. clusters = create_clusters(vectors, distance, codeBook)
  142. newDistance = calculate_distance(clusters, codeBook)
  143.  
  144. print('Блоки', vectors, sep='\n', end='\n\n')
  145. print('В исправленной кодовой книге %s элементов' % len(codeBook))
  146. print('Исправленная кодовая книга:', codeBook, sep='\n', end='\n\n')
  147. print('Матрица индексов кодовой книги:', np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))),
  148.       sep='\n', end='\n\n')
  149. np.savetxt('matrix.txt', np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))), fmt='%u')
  150.  
  151.  
  152. averageDistanceList = []
  153. for i in range(len(np.array(newDistance))):
  154.     averageDistanceList.append(np.average(np.array(newDistance)[i]))
  155. averageDistance = np.average(np.array(averageDistanceList))
  156. print('averageDistance', averageDistance)
  157. g = 1
  158. print('Итерация 0:')
  159. lastAverageDistance, averageDistance, codeBook, clusters, distance = \
  160.         modify_code_book(averageDistance, clusters, codeBook)
  161. np.savetxt('matrix0.txt', np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))), fmt='%u')
  162. print()
  163. exit()
  164.  
  165. while True:
  166.     lastAverageDistance, averageDistance, codeBook, clusters, distance = \
  167.         modify_code_book(averageDistance, clusters, codeBook)
  168.     print(averageDistance)
  169.     print('В исправленной кодовой книге %s элементов' % len(codeBook))
  170.     print('Исправленная кодовая книга:', codeBook, sep='\n', end='\n\n')
  171.     print('Матрица индексов кодовой книги:',
  172.           np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))),
  173.           sep='\n', end='\n\n')
  174.     np.savetxt('matrix%s.txt' %g, np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))), fmt='%u')
  175.     print('%s итерация, значение (D(k-1)-D(k))/D(k) = %s' %
  176.           (g, ((lastAverageDistance - averageDistance) / averageDistance)))
  177.     g += 1
  178.     if (lastAverageDistance - averageDistance)/averageDistance <= D:
  179.         break
  180.  
  181. newBitMap = []
  182. distance = np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance))))
  183. print(len(codeBook))
  184. print(distance)
  185. for i in range(5):
  186.     for j in range(5):
  187.         newBitMap.append(codeBook[distance[i][j]])
  188. newBitMap = np.array(newBitMap)
  189. bitmap = []
  190. for x in range(len(newBitMap)):
  191.     for y in range(len(newBitMap[x])):
  192.         for i in range(len(newBitMap[x][y])):
  193.             bitmap.append(newBitMap[x][y][i])
  194. bitmap = np.array(bitmap)
  195. img3 = Image.fromarray(np.reshape(bitmap, (int(sqrt(len(bitmap))), int(sqrt(len(bitmap))))), mode='L')
  196. img3.save('my.png')
  197. img3.show()
  198.  
  199. #print_clusters(clusters, codeBook)
  200. # # #if np.any(np.greater(namearray, value)):
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement