Реконструкция изображения СВД в Python - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь выполнить разложение по сингулярным значениям этого изображения:

введите описание изображения здесь

с первыми 10 значениями. У меня есть этот код:

from PIL import Image
import numpy as np

img = Image.open('bee.jpg')
img = np.mean(img, 2)
U,s,V = np.linalg.svd(img)
recon_img = U @ s[1:10] @ V

, но когда я его запускаю, он выдает мне эту ошибку:

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 9 is different from 819)

Так что я думаю, что делаю что-то не так, когда делаю реконструкцию. Я не уверен в размерах матрицы, которую создает np.linalg.svd(img). Как решить?

Извините за англи sh

1 Ответ

0 голосов
/ 10 июля 2020

Проблема заключается в размере s, если вы напечатаете размеры U, s и V, я получу:

print(np.shape(U))
print(np.shape(s))
print(np.shape(V))

(819, 819)
(819,)
(1024, 1024)

Итак, U и V квадратная матрица, s массив. Вы должны создать матрицу с теми же размерами, что и ваше изображение (819 x 1024), с s по главной диагонали следующим образом:

n = 10
S = np.zeros(np.shape(img))
for i in range(0, n):
    S[i,i] = s[i]
print(np.shape(S))

output:

(819, 1024)

Затем вы можете продолжить разработку. Для сравнения проверьте этот код:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

img = Image.open('bee.jpg')
img = np.mean(img, 2)

U,s,V = np.linalg.svd(img)

n = 10
S = np.zeros(np.shape(img))
for i in range(0, n):
    S[i,i] = s[i]

recon_img = U @ S @ V

fig, ax = plt.subplots(1, 2)

ax[0].imshow(img)
ax[0].axis('off')
ax[0].set_title('Original')

ax[1].imshow(recon_img)
ax[1].axis('off')
ax[1].set_title(f'Reconstructed n = {n}')

plt.show()

, который дает мне это:

введите описание изображения здесь

...