-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.py
93 lines (76 loc) · 2.75 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from PIL import Image
from io import BytesIO
import webcolors
import numpy as np
import math
import matplotlib.pyplot as plt
from importlib import reload
from mpl_toolkits import mplot3d
import seaborn as sns
def get_image_size(img):
img_file = BytesIO()
image = Image.fromarray(np.uint8(img))
image.save(img_file, 'png')
return img_file.tell()/1024
def closest_colour(requested_colour):
min_colours = {}
for key, name in webcolors.CSS3_HEX_TO_NAMES.items():
r_c, g_c, b_c = webcolors.hex_to_rgb(key)
rd = (r_c - requested_colour[0]) ** 2
gd = (g_c - requested_colour[1]) ** 2
bd = (b_c - requested_colour[2]) ** 2
min_colours[(rd + gd + bd)] = name
return min_colours[min(min_colours.keys())]
def get_colour_name(requested_colour):
try:
closest_name = actual_name = webcolors.rgb_to_name(requested_colour)
except ValueError:
closest_name = closest_colour(requested_colour)
return closest_name
def replaceWithCentroid(kmeans,ori_img):
new_pixels = []
for label in kmeans.labels_:
pixel_as_centroid = list(kmeans.cluster_centers_[label])
new_pixels.append(pixel_as_centroid)
new_pixels = np.array(new_pixels).reshape(*ori_img.size, -1)
return new_pixels
def plotImage(img_array, size):
reload(plt)
plt.imshow(np.array(img_array/255).reshape(*size))
plt.axis('off')
return plt
def calculateBCSS(X, kmeans):
_, label_counts = np.unique(kmeans.labels_, return_counts = True)
diff_cluster_sq = np.linalg.norm(kmeans.cluster_centers_ - np.mean(X, axis = 0), axis = 1)**2
return sum(label_counts * diff_cluster_sq)
def calculateDerivative(data):
derivative = []
for i in range(len(data)):
if i == 0:
# FORWARD DIFFERENCE
d = data[i+1] - data[i]
elif i == len(data) - 1:
# BACKWARD DIFFERENCE
d = data[i] - data[i-1]
else:
# CENTER DIFFERENCE
d = (data[i+1] - data[i-1])/2
derivative.append(d)
return np.array(derivative)
def locateDrasticChange(x, y):
# CALCULATE GRADIENT BY FIRST DERIVATIVE
first_derivative = calculateDerivative(np.array(y))
# CALCULATE CHANGE OF GRADIENT BY SECOND DERIVATIVE
second_derivative = calculateDerivative(first_derivative)
return np.argmax(np.abs(second_derivative)) + x[0]
def locateOptimalElbow(x, y):
# START AND FINAL POINTS
p1 = (x[0], y[0])
p2 = (x[-1], y[-1])
# EQUATION OF LINE: y = mx + c
m = (p2[1] - p1[1]) / (p2[0] - p1[0])
c = (p2[1] - (m * p2[0]))
# DISTANCE FROM EACH POINTS TO LINE mx - y + c = 0
a, b = m, -1
dist = np.array([abs(a*x0+b*y0+c)/math.sqrt(a**2+b**2) for x0, y0 in zip(x,y)])
return np.argmax(dist) + x[0]