-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPCAKmeans.py
120 lines (88 loc) · 3.4 KB
/
PCAKmeans.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import cv2
import numpy as np
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from collections import Counter
from scipy.misc import imread, imresize, imsave
def find_vector_set(diff_image, new_size):
i = 0
j = 0
vector_set = np.zeros((int(new_size[0] * new_size[1] / 25), 25))
print('\nvector_set shape',vector_set.shape)
while i < vector_set.shape[0]:
while j < new_size[0]:
k = 0
while k < new_size[1]:
block = diff_image[j:j+5, k:k+5]
#print(i,j,k,block.shape)
feature = block.ravel()
vector_set[i, :] = feature
k = k + 5
j = j + 5
i = i + 1
mean_vec = np.mean(vector_set, axis = 0)
vector_set = vector_set - mean_vec
return vector_set, mean_vec
def find_FVS(EVS, diff_image, mean_vec, new):
i = 2
feature_vector_set = []
while i < new[0] - 2:
j = 2
while j < new[1] - 2:
block = diff_image[i-2:i+3, j-2:j+3]
feature = block.flatten()
feature_vector_set.append(feature)
j = j+1
i = i+1
FVS = np.dot(feature_vector_set, EVS)
FVS = FVS - mean_vec
print("\nfeature vector space size",FVS.shape)
return FVS
def clustering(FVS, components, new):
kmeans = KMeans(components, verbose = 0)
kmeans.fit(FVS)
output = kmeans.predict(FVS)
count = Counter(output)
least_index = min(count, key = count.get)
print(new[0],new[1])
change_map = np.reshape(output,(new[0] - 4, new[1] - 4))
return least_index, change_map
def find_PCAKmeans(imagepath1, imagepath2):
print('Operating')
image1 = imread(imagepath1)
image2 = imread(imagepath2)
print(image1.shape,image2.shape)
new_size = np.asarray(image1.shape) / 5
new_size = new_size.astype(int) * 5
image1 = imresize(image1, (new_size)).astype(np.int16)
image2 = imresize(image2, (new_size)).astype(np.int16)
diff_image = abs(image1 - image2)
imsave('diff.jpg', diff_image)
print('\nBoth images resized to ',new_size)
vector_set, mean_vec = find_vector_set(diff_image, new_size)
pca = PCA()
pca.fit(vector_set)
EVS = pca.components_
FVS = find_FVS(EVS, diff_image, mean_vec, new_size)
print('\ncomputing k means')
components = 3
least_index, change_map = clustering(FVS, components, new_size)
change_map[change_map == least_index] = 255
change_map[change_map != 255] = 0
change_map = change_map.astype(np.uint8)
kernel = np.asarray(((0,0,1,0,0),
(0,1,1,1,0),
(1,1,1,1,1),
(0,1,1,1,0),
(0,0,1,0,0)), dtype=np.uint8)
cleanChangeMap = cv2.erode(change_map,kernel)
imsave("changemap.jpg", change_map)
imsave("cleanchangemap.jpg", cleanChangeMap)
if __name__ == "__main__":
a = 'ElephantButte_08201991.jpg'
b = 'ElephantButte_08272011.jpg'
a1 = 'Dubai_11122012.jpg'
b1 = 'Dubai_11272000.jpg'
a2 = 'Andasol_09051987.jpg'
b2 = 'Andasol_09122013.jpg'
find_PCAKmeans(a,b)