Advertisement
akariya

[ECE592] Project 4 P1_1_2 Image compression using kmeans

Nov 12th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.15 KB | None | 0 0
  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. def runKmeans(img, p, C):
  5.     y , x = img.shape
  6.     number_of_patches = int((y * x)/(p ** 2))
  7.     data = []
  8.     i = 0
  9.     for i in range(0, y - 1, p):
  10.         for j in range(0, x - 1, p):
  11.             patch = img[i:i+p, j:j+p]
  12.             data.append(patch)
  13.     criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.1)
  14.     R = (np.log2(C)*number_of_patches)/(y * x)
  15.     compactness, labels, centers = cv2.kmeans(np.asarray(data).astype('float32'),C,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
  16.     i = 0
  17.     data_point = 0
  18.     for i in range(0, y - 1, p):
  19.         for j in range(0, x - 1, p):
  20.             img[i:i+p, j:j+p] = centers[labels[data_point][0]].reshape(p,p)
  21.             data_point += 1
  22.     return [R, compactness**0.5, img]
  23.  
  24. imgC = cv2.imread('suzdal.jpg', 0)[373:885,100:612]
  25. cv2.imshow('original', imgC)
  26. cv2.waitKey(0)
  27. cv2.destroyAllWindows()
  28. p = 4
  29. C = 16
  30. RD = runKmeans(imgC.copy(), p, C)
  31. error = np.mean(((imgC.astype('float32') - RD[2].astype('float32')).astype('float32') * (imgC.astype('float32') - RD[2].astype('float32')).astype('float32')).flatten())
  32. print(error)
  33. cv2.imshow('compressed',RD[2])
  34. cv2.waitKey(0)
  35. cv2.destroyAllWindows()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement