Mar-14-2019, 01:14 PM
(This post was last modified: Mar-14-2019, 01:15 PM by route2sabya.)
I am a Python beginner. I am trying to follow the tutorial posted here about change detection for satellite images.
I am receiving a value error. Can anyone guide me towards resolving the issue.
File "D:/Numer8/change_detection4.py", line 26, in find_vector_set
vector_set[i, :] = feature
ValueError: could not broadcast input array from shape (75) into shape (25)
I am receiving a value error. Can anyone guide me towards resolving the issue.
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]) * int(new_size[1])) // 25, 25))
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]
feature = block.ravel()
vector_set[i, :] = feature
k = k + 5
j = j + 5
i = i + 1
print ('vector_set shape', vector_set.shape)
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 ("feature 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)
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)
new_size = np.asarray(image1.shape) // 25
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 ('Both 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 ('computing 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 = 'Argentina_01131994_md.jpg'
b = 'Argentina_01202014_md.jpg'
find_PCAKmeans(a,b)
OUTPUT : File "D:/Numer8/change_detection4.py", line 26, in find_vector_set
vector_set[i, :] = feature
ValueError: could not broadcast input array from shape (75) into shape (25)
