3D-сжатие изображения с NumPy

python arrays numpy compression svd

876 просмотра

2 ответа

У меня есть 3d-массив, представляющий объект с ячейками в качестве вокселей и вокселями, имеющими значения от 1 до 10. Я хотел бы сжать изображение (а), чтобы сделать его меньше, и (б), чтобы позже получить краткое представление о том, как Сложное изображение происходит путем сжатия его до минимального уровня согласования с исходным изображением.

Я использовал SVD, чтобы сделать это с 2D-изображениями и посмотреть, сколько сингулярных значений потребовалось, но похоже, что с 3D-изображениями возникают трудности. Если, например, я смотрю на диагональные члены в S-матрице, все они равны нулю, и я ожидал сингулярных значений.

Есть ли способ использовать SVD для сжатия 3D-массивов (например, сглаживание в некотором роде)? Или другие методы более уместны? При необходимости я мог бы, вероятно, упростить значения вокселей до 0 или 1.

Автор: aphall Источник Размещён: 08.11.2019 11:11

Ответы (2)


2 плюса

Вы можете по существу применить тот же принцип к трехмерным данным, не выравнивая их. Существует несколько алгоритмов для разделения N-мерных матриц, таких как CP-ALS (с использованием чередующихся наименьших квадратов), и это реализовано в скейтсоре пакета . Вы можете использовать пакет для разложения тензора, получившего ранг :

from sktensor import dtensor, cp_als
T = dtensor(X)
rank = 5
P, fit, itr, exectimes = cp_als(T, rank, init='random')

С Xвашими данными. Затем вы можете использовать весовые коэффициенты weights = P.lmbdaдля восстановления исходного массива Xи вычисления ошибки восстановления, как если бы вы использовали SVD.

Другие методы декомпозиции для трехмерных данных (или в общем случае тензоров) включают декомпозицию Такера или каноническую декомпозицию (также доступную в том же пакете).

Это не 3D SVD напрямую, но все методы, описанные выше, могут быть использованы для анализа основных компонентов ваших данных.

Найдите ниже (только для полноты) изображение разложения Такера:

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

И ниже приводится другое изображение разложения, которое CP-ALS (алгоритм оптимизации) пытается получить:

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

Изображение предоставлено:

1- http://www.slideshare.net/KoheiHayashi1/talk-in-jokyonokai-12989223

2- http://www.bsp.brain.riken.jp/~zhougx/tensor.html

Автор: Imanol Luengo Размещён: 20.08.2016 04:10

0 плюса

То, что вы хотите, это разложение svd / Tucker более высокого порядка .

В трехмерном случае вы получите три матрицы проекций (по одной для каждого измерения) и тензор ядра низкого ранга (трехмерный массив).

Вы можете сделать это легко с помощью TensorLy :

from tensorly.decomposition import tucker
core, factors = tucker(tensor, ranks=[2, 3, 4])

Здесь coreбудет иметь форму (2, 3, 4) и len(factors)будет 3один фактор для каждого измерения.

Автор: Jean Размещён: 23.06.2017 06:50
Вопросы из категории :
32x32