Python实现Collaborative Representation Detector(CRD)高光谱异常检测算法

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  # XX为图像的长度 YY为图像的高度 band为图像的波段数
    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
    # padding avoid edges
    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()

你可能感兴趣的:(计算机视觉,高光谱,python,计算机视觉,目标检测)