项目作者: Retsediv

项目描述 :
Extended SVD algorithm for image compression
高级语言: Jupyter Notebook
项目地址: git://github.com/Retsediv/SVDImageCompression.git
创建时间: 2017-12-05T17:52:23Z
项目社区:https://github.com/Retsediv/SVDImageCompression

开源协议:

下载


SVDImageCompression

A variation of SVD based image compression algorithm. SSVD(Shuffled SVD)

В ході роботи над алгоритмом було розроблено спершу звичайний SVD алгоритм, а потім і розширений SSVD із простим інтерфейсом у вигляді функції, котра стискає будь яке зображення із заданим рангом та розміром блоків.

Дані, на яких проводились експерименти

У своїй роботі автори узагальнюють алгоритм до квадратних, чорно-білих зображень. В результаті роботи було реалізовано метод стискання зображень будь якого розміру та навіть кольорових зображень, хоча, як було виявлено пізніше SVD(SSVD) не надто добре підходить до кольорових зображень.

Алгоритм на вході приймає матрицю зображення, а також кілька додаткових параметрів:

  1. mode - “grayscale” чи “rgb”. Режим роботи: чорно-білі або кольорові зображення
  2. block_size - розмір блоків для операції перемішування(п. 1 опису алгоритму)
  3. rank - ранг матриці, до котрої ми хочемо стиснути початкову

На виході ми отримаємо матрицю стисненого зображення.

Опис експерименту

Для експерименту була вибрана відома фотографія Lena, котра дуже часто наводиться у прикладах зі стисканням зображень і також присутня в оригінальній роботі, тому в результаті цього було зручно і легко порівняти власні результати та ті, котрі отримали автори статті.

Приклад виклику функції для SSVD стискання:

  1. from PIL import Image
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import svd_algo.compress_image as ci
  5. # Open the image and convert it to numpy.arrray
  6. img = Image.open('test_image.jpg')
  7. img = np.array(img)
  8. # Compress the rgb image with rank=30 and size of blocks=16
  9. compressedImage = ci.compress_image(
  10. coloredImg,
  11. mode='rgb',
  12. block_size=16,
  13. rank=30
  14. )
  15. # Display the compressed image
  16. plt.figure(figsize=(12,6))
  17. plt.imshow(compressedImage);

У репозиторії є jupyter-notebooks, у котрих покроково показана реалізації та використання кожного методу(звичайного SVD, чорно-білого SSVD, кольорового SSVD) а також есперименти та порівняння, котрі проводились(папка examples).

Початкове зображення:

Original Lenna image

Порівняння стискання чорно-білих зображень за допомогою SVD, SSVD(block size=8) та SSVD(block size=16)

Grayscale images compression comparison

Порівняння стискання кольорового зображення за допомогою SVD та SSVD(block size=16)
Colored image compression comparison

Також для такої фотографії було визначено кількість елементів(в матриці зображення) до початку стиснення та після проведення стиснення(скільки елементів потрібно зберігати, щоб потім отримати коректну апроксимацію зображення).
Image size comparasion(elements in matrices)

Після цього я спробував записати ці матриці у файл у бінарному вигляді(можливість бібліотеки numpy). Результати(значення в кілобайтах):

Image size comparasion(in kb)

Весь код цього порівняння є у файлі examples/CompareQualityAndSize.ipynb
Багато прикладів стискання різних зображень та роботи із ними є у файлах: BasicSVDImageCompression.ipynb, ColoredSVDImageCompression.ipynb, ExtendedSVDImageCompression.ipynb

Висновки

В результаті роботи над алгоритмом стискання зображень було детально вивчено базовий алгоритм SVD та його застосування у різних сферах. Я розібрався із бібліотеками numpy, matplotlib та PIL. Навчився працювати із зображеннями, їх “трансформуванням” у звичайні матриці, розбиттю кольорового зображення на різні “шари”(червоний, зелений та синій) та подальшою обробкою. Написано відповідну реалізацію алгоритму, описану у оригінальній статті, а також зроблено вдосконалення алгоритму для роботи із будь якими зображеннями.
Найбільшу складність викликало математичне усвідомлення SVD алгоритму, його подальша реалізація та те, що автори статті наводять усі приклади для чорно-білих, квадратних зображень і потрібно було самостійно робити узагальнення роботи алгоритму для будь якого зображення.
Незрозумілим залишилось bit allocation strategy та uniform quantization. Через брак інформації не зрозуміло до кінця як це працює і як реалізувати ці ідеї.