И в линейной алгебре, и в численном анализе используется метод матричной факторизации, известный как разложение по сингулярным значениям (SVD). Это мощный инструмент анализа данных, который можно использовать, помимо прочего, в обработке сигналов, статистике и машинном обучении.

SVD разлагает матрицу на три матрицы: U, S и V. Исходная матрица A может быть выражена как:

где U — матрица размера m x r, S — диагональная матрица размера r x r с неотрицательными вещественными числами, а V^T — матрица размера r x n. Здесь m, n и r — размерности исходной матрицы A.

Матрица U содержит левые сингулярные векторы матрицы A, которые описывают взаимосвязь между строками матрицы A. Матрица V содержит правые сингулярные векторы матрицы A, которые описывают взаимосвязь между столбцами матрицы A. Матрица S содержит сингулярные значения A, которые представляют силу этих отношений.

Сохраняя только наиболее значимые сингулярные значения и соответствующие им сингулярные векторы, SVD используется при сжатии изображений для уменьшения размера изображения. Это может существенно уменьшить объем дополнительной памяти, который требуется для хранения изображения, без потери наиболее важных визуальных данных. Цифровая фотография, потоковое видео и архивирование изображений — это лишь некоторые из множества областей, в которых сжатие изображений на основе SVD часто используется для сжатия изображений.

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

Импорт необходимых библиотек

import requests
import cv2
import numpy as np
import matplotlib.pyplot as plt

Загрузите изображение и преобразуйте изображение в оттенки серого.

img = cv2.imread('flower.bmp')

gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Преобразование изображения в двойной формат

gray_image = gray_image.astype(np.float64)

Выполните разложение по единственному значению

U, s, V = np.linalg.svd(gray_image, full_matrices=False)
print(f"U.shape:{U.shape}, s.shape:{s.shape}, V.shape: {V.shape}")

Давайте узнаем 10 лучших сингулярных значений

top_10_singular_values = s[:10]
print("Top 10 Singular Values: \n", top_10_singular_values)

Давайте построим сингулярные значения и их ранжирование

plt.plot(range(1, len(s) + 1), s, 'r-')
plt.xlabel("Rankings")
plt.ylabel("Singular Values")
plt.title("Singular Values versus their Rankings")
plt.savefig("Singular_values_vs_rankings.png")
plt.show()

Из графика сингулярных значений и их ранжирования мы можем заметить, что большая часть матричных значений изображения содержится в небольшом количестве сингулярных значений, в то время как из графика мы можем заметить, что более высокое сингулярное значение содержит очень минимальный уровень информации об изображении. . Наше наблюдение поддерживает использование разложения по сингулярным значениям для уменьшения размерности и сжатия изображения.

Теперь давайте попробуем восстановить и отобразить изображение, используя три матрицы SVD.

k_values = [10, 50, 100]

plt.figure(figsize=(12,6))

for i in range(len(k_values)):
    low_rank = U[:, :k_values[i]] @ np.diag(s[:k_values[i]]) @ V[:k_values[i], :]
    plt.subplot(2,3,i+1),
    plt.imshow(low_rank, cmap='gray'),
    plt.title(f"For K value = {k_values[i]}")
    plt.savefig("Reconstruction_with_k_values.png")

Когда мы выводим сжатые изображения для разных сингулярных значений, мы можем заметить значительную разницу во всех изображениях с разными значениями K. Во-первых, мы использовали 10 лучших сингулярных значений, и полученные изображения совсем не четкие.

Во-вторых, мы использовали 50 лучших сингулярных значений, и полученное изображение стало более четким, чем предыдущее, но в то же время мы можем заметить небольшое размытие изображения.

На третьем изображении, когда мы пробовали 100 лучших сингулярных значений, изображение становится все более четким, чем два предыдущих изображения.

Короче говоря, мы можем сделать вывод, что если мы продолжим увеличивать K-значения, мы всегда будем получать более четкое изображение, чем предыдущие K-значения. Можно сказать, что с увеличением значения К увеличивается и четкость изображения.

В заключение, Singular Value Decomposition (SVD) — это мощный метод сжатия изображений, который помогает сохранить большую часть важной визуальной информации при уменьшении размера изображения.

Ваши мысли и отзывы по этому поводу очень приветствуются. Подпишитесь на меня в LinkedIn и GitHub. Большое спасибо за чтение!