Я пытаюсь реализовать усиление цвета PCA из бумаги AlexNet (2012), но следующий код не работает.
# original image is 400x600x3 of dtype uint8
scaled_img = np.reshape(img,(img.shape[0]*img.shape[1],3))
scaled_img = scaled_img.astype('float32')
mean = np.mean(scaled_img, axis=0)
std = np.std(scaled_img, axis=0)
scaled_img -= mean
scaled_img /= std
cov = np.cov(scaled_img, rowvar=False)
lambdas, p = np.linalg.eig(cov)
alphas = np.random.normal(0, 0.1, 3)
# sort eigenvalues in descending order
idx = np.argsort(lambdas)[::-1]
p = p[:,idx]
# sort eigenvectors according to same index
lambdas = lambdas[idx]
delta = np.dot(np.matrix(p).T, np.matrix(alphas*lambdas).T) # matrix multiplication
pca_color_img = np.matrix(scaled_img) + delta.T
pca_color_img = np.array(pca_color_img) * std + mean
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
pca_color_img = min_max_scaler.fit_transform(pca_color_img)
Если я реализую это, я получу то же изображение, что и оригинал, только что масштабированный до 0 ~ 1. (имеется в виду original_img/255. = pca_color_img_result
). Это означает, что мне не хватает некоторых частей, но я не могу понять это.
Я стандартизировал свое изображение с помощью (- mean) и (/ std), которые я выполняю наоборот (* std и + mean) при получении pca_augmented_img в конце. После повторной стандартизации моего выхода (* std и + mean) я изменил масштаб выходного сигнала, чтобы он находился в диапазоне [0, 1].