Advertisement
Guest User

Untitled

a guest
Oct 26th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.14 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.     blocks = []
  91.     for i in range(len(clusters)):
  92.         for j in range(len(clusters[i])):
  93.             blocks.append(clusters[i][j])
  94.     distance = initiate_distance(blocks, code_book)
  95.  
  96.     code_book = code_book_checker(code_book, distance)
  97.     clusters = create_clusters(blocks, distance, code_book)
  98.     new_distance = calculate_distance(clusters, code_book)
  99.     average_distance_list = []
  100.     for i in range(len(np.array(new_distance))):
  101.         average_distance_list.append(np.average(np.array(new_distance)[i]))
  102.     average_distance = np.average(np.array(average_distance_list))
  103.     return(old_average_distance, average_distance, code_book, clusters, distance)
  104.  
  105.  
  106. def print_clusters(clusters, code_book):
  107.     for i in range(len(code_book)):
  108.         print('%s кластер:' % i)
  109.         for j in range(len(clusters[i])):
  110.             print(clusters[i][j])
  111.         print()
  112.  
  113.  
  114. def euclid_distance(vector, entry_code_book):
  115.     result = 0
  116.     for x in range(len(vector)):
  117.         for y in range(len(vector)):
  118.             result += (vector[y][x] - entry_code_book[y][x])**2
  119.     return sqrt(result)
  120. # codeBookSize = int(input('codeBookSize:'))
  121. # eps = int(input('eps:'))
  122.  
  123. codeBookSize = 64
  124. eps = 1
  125. D = 0.01
  126. fileName = 'img.bmp'
  127. img = Image.open(fileName)
  128. width, height = img.size[0], img.size[1]
  129. widthVectors, heightVectors = int(width/4), int(height/4)
  130.  
  131. vectors = split_img(img, width, height)  # split pic
  132. codeBook = split_code_book(calculate_average_vector(vectors), codeBookSize, eps)  # initial codebook
  133. distance = initiate_distance(vectors, codeBook)  # make clusters
  134. # print('В инициализированной кодовой книге %s элементов' % len(codeBook))
  135. # print('Инициализированная кодовая книга:', codeBook, sep='\n', end='\n\n')
  136. codeBook = code_book_checker(codeBook, distance)  # check codebook
  137. clusters = create_clusters(vectors, distance, codeBook)
  138. newDistance = calculate_distance(clusters, codeBook)
  139.  
  140. # print('Блоки', vectors, sep='\n', end='\n\n')
  141. # print('В исправленной кодовой книге %s элементов' % len(codeBook))
  142. # print('Исправленная кодовая книга:', codeBook, sep='\n', end='\n\n')
  143. # print('Матрица индексов кодовой книги:', np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))),
  144. #       sep='\n', end='\n\n')
  145.  
  146. # np.savetxt('matrix.txt', np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))), fmt='%u')
  147.  
  148. averageDistanceList = []
  149. for i in range(len(np.array(newDistance))):
  150.     averageDistanceList.append(np.average(np.array(newDistance)[i]))
  151. averageDistance = np.average(np.array(averageDistanceList))
  152. # print('averageDistance', averageDistance)
  153. # print('clusters', clusters)
  154. # print('cluster1', clusters[0])
  155. #
  156. # print('D-1:', lastAverageDistance)
  157. # print('D:', averageDistance)
  158. # print('codeBook', codeBook)
  159. # print('clusters', clusters)
  160. # print('distance', distance)
  161. # print('cluster1', clusters[0])
  162.  
  163. g = 1
  164. while True:
  165.     lastAverageDistance, averageDistance, codeBook, clusters, distance = \
  166.         modify_code_book(averageDistance, clusters, codeBook)
  167.     print(averageDistance)
  168.     print('В исправленной кодовой книге %s элементов' % len(codeBook))
  169.     print('Исправленная кодовая книга:', codeBook, sep='\n', end='\n\n')
  170.     print('Матрица индексов кодовой книги:',
  171.           np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))),
  172.           sep='\n', end='\n\n')
  173.     np.savetxt('matrix%s.txt' %g, np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance)))), fmt='%u')
  174.     print('%s итерация, значение (D(k-1)-D(k))/D(k) = %s' %
  175.           (g, ((lastAverageDistance - averageDistance) / averageDistance)))
  176.     g += 1
  177.     if (lastAverageDistance - averageDistance)/averageDistance <= D:
  178.         break
  179.  
  180. newBitMap = []
  181. distance = np.array(distance).reshape(int(sqrt(len(distance))), int(sqrt(len(distance))))
  182. print(len(codeBook))
  183. print(distance)
  184. for i in range(len(distance)):
  185.     for j in range(len(distance[i])):
  186.         newBitMap.append(codeBook[distance[i][j]])
  187. newBitMap = np.array(newBitMap)
  188. bitmap = []
  189. for x in range(len(newBitMap)):
  190.     for y in range(len(newBitMap[x])):
  191.         for i in range(len(newBitMap[x][y])):
  192.             bitmap.append(newBitMap[x][y][i])
  193. print(bitmap[0], bitmap[1])
  194. print(np.array(bitmap).reshape(int(sqrt(len(bitmap))), int(sqrt(len(bitmap))))[0][0])
  195. print(np.array(bitmap).reshape(int(sqrt(len(bitmap))), int(sqrt(len(bitmap))))[0][1])
  196. np.savetxt('bitmap.txt', np.array(bitmap).astype(np.uint8).reshape(int(sqrt(len(bitmap))), int(sqrt(len(bitmap)))), fmt='%u')
  197. img3 = Image.fromarray(np.array(bitmap).astype(np.uint8).reshape(int(sqrt(len(bitmap))), int(sqrt(len(bitmap)))), mode='L')
  198. img3.show()
  199. img3.save('1.png', 'PNG')
  200.  
  201.  
  202. #print_clusters(clusters, codeBook)
  203. # # #if np.any(np.greater(namearray, value)):
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement