Как нанести PCA на изображение - PullRequest
0 голосов
/ 23 октября 2019

У меня серое шумное изображение. Я хочу применить PCA для снижения шума и увидеть результаты после применения.

Вот что я пытался сделать:

[in]:


from sklearn.datasets import load_sample_image
from sklearn.feature_extraction import image
from sklearn.decomposition import PCA
# Create patches of size 25 by 25 and create a matrix from all patches
patches = image.extract_patches_2d(grayscale_image, (25, 25), random_state = 42)
print(patches.shape)
# reshape patches because I got an error when applying fit_transform(ValueError: FoundValueError: Found array with dim 3. Estimator expected <= 2.)
patches_reshaped = patches.reshape(2,-1)
#apply PCA
pca = PCA()
projected = pca.fit_transform(patches_reshaped.data)
denoised_image = pca.inverse_transform(projected)
imshow(denoised_image)

[out]:

pca_result
(источник: imggmi.com )

В результате я получаю массив. Как увидеть изображение без шума?

1 Ответ

1 голос
/ 24 октября 2019

Чтобы увидеть ваше зашумленное изображение, вам необходимо преобразовать данные, представленные в небольшом размере, с использованием основных компонентов обратно в исходное пространство. Для этого вы можете использовать функцию inverse_transform(). Как видно из документации здесь , эта функция будет принимать проецируемые данные и возвращать массив, подобный исходному изображению. Таким образом, вы можете сделать что-то вроде

denoised_image = pca.inverse_transform(projected)
# then view denoised_image

Edit:

Вот некоторые из вопросов, на которые стоит обратить внимание:

  1. У вас есть 53824 патчиот вашего исходного изображения с размерами (25,25). Чтобы изменить ваши данные и передать их в PCA, как вы можете видеть из документации здесь , вам нужно передать массив размером (n_samples, n_features). Ваше количество образцов составляет 53824. Таким образом, измененные патчи должны быть:
patches_reshaped = patches.reshape(patches.shape[0],-1)
# this should return a (53824, 625) shaped data
Теперь вы используете эти измененные данные и преобразуете их, используя PCA и обратное преобразование, чтобы получить данные в исходном домене. После этого ваш denoised_image будет набором восстановленных патчей. Вам нужно будет объединить эти патчи, чтобы получить изображение, используя функцию image.reconstruct_from_patches_2d , здесь - документация. Таким образом, вы можете сделать что-то вроде
denoised_image = image.reconstruct_from_patches_2d(denoised_image.reshape(-1,25,25), grayscale_image.shape)

Теперь вы можете просмотреть denoised_image, который должен выглядеть как grayscale_image.

...