import scipy.io as scio
from scipy.linalg import pinv
import numpy as np
import matplotlib.pyplot as plt
import time
def CRD(mat, win_in, win_out, regularization):
rows, cols, bands = mat.shape
result = np.zeros((rows, cols))
w1 = int(np.fix(win_out / 2))
w2 = int(np.fix(win_in / 2))
M = win_out ** 2
num_sam = win_out * win_out - win_in * win_in
DataTest = np.zeros((3 * rows, 3 * cols, bands))
DataTest[rows: 2 * rows, cols: 2 * cols, :] = mat
DataTest[rows: 2 * rows, 0: cols, :] = mat[:, cols:: -1, :]
DataTest[rows: 2 * rows, 2 * cols: 3 * cols, :] = mat[:, cols:: -1, :]
DataTest[0: rows, :, :] = DataTest[2 * rows:rows:-1, :, :]
DataTest[2 * rows: 3 * rows, :, :] = DataTest[2 * rows:rows:-1, :, :]
Gamma = np.zeros((1, num_sam))
for i in range(cols, 2 * cols):
for j in range(rows, 2 * rows):
block = DataTest[j - w1: j + w1 + 1, i - w1: i + w1 + 1, :].copy()
y = DataTest[j, i, :].copy().T
block[w1 - w2: w1 + w2 + 1, w1 - w2: w1 + w2 + 1, :] = np.NAN
block = np.reshape(block, (M, bands))
block = np.delete(block, np.where(np.isnan(block[:, 0]))[0], axis=0)
Xs = block.T
for k in range(num_sam):
Gamma[0][k] = np.linalg.norm(y.T - Xs[:, k], 2)
Gamma_t = np.squeeze(Gamma)
Gamma_y = np.diag(Gamma_t)
weights = np.dot(np.dot(pinv(np.dot(Xs.T, Xs) + regularization * np.dot(Gamma_y.T, Gamma_y)), Xs.T), y.T)
y_hat = np.dot(Xs, weights[:]).T
result[j - rows][i - cols] = np.linalg.norm(y - y_hat, 2)
return result
if __name__ == '__main__':
t1 = time.time()
dataFile = 'Airport.mat'
data = scio.loadmat(dataFile)
result = CRD(data['data'], 3, 7, 0.01)
t2 = time.time()
print('time:', round(t2 - t1, 3), 's')
plt.imshow(result)
plt.show()