Сжатие изображений с низкоранговым SVD

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

Загрузка изображения

Загрузите изображение street1.jpg, на котором изображена городская улица. Матрица 3-D, которая формирует это изображение uint8, поэтому преобразуйте изображение в матрицу полутонового цвета. Просмотрите изображение с аннотацией исходного ранга матрицы.

A = imread('street1.jpg');
A = rgb2gray(A);
imshow(A)
title(['Original (',sprintf('Rank %d)',rank(double(A)))])

Figure contains an axes. The axes with title Original (Rank 480) contains an object of type image.

Сжатие изображения

Использование svdsketch вычислить низкоранговую матрицу, которая аппроксимирует A в пределах допуска 1e-2. Сформируйте матрицу низкого ранга путем умножения коэффициентов SVD, возвращаемых на svdsketch, преобразуйте результат в uint8, и просмотреть получившееся изображение.

[U1,S1,V1] = svdsketch(double(A),1e-2);
Anew1 = uint8(U1*S1*V1');
imshow(uint8(Anew1))
title(sprintf('Rank %d approximation',size(S1,1)))

Figure contains an axes. The axes with title Rank 288 approximation contains an object of type image.

svdsketch приводит к приближению ранга 288, что приводит к некоторой незначительной зернистости в некоторых граничных линиях изображения.

Теперь сжимайте изображение второй раз, используя допуск 1e-1. Когда величина допуска увеличивается, ранг приближения, произведенного svdsketch обычно уменьшается.

[U2,S2,V2] = svdsketch(double(A),1e-1);
Anew2 = uint8(U2*S2*V2');
imshow(Anew2)
title(sprintf('Rank %d approximation',size(S2,1)))

Figure contains an axes. The axes with title Rank 48 approximation contains an object of type image.

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

Предельный размер подпространства

svdsketch адаптивно определяет, какой ранг использовать для матричного эскиза на основе заданного допуска. Однако можно использовать MaxSubspaceDimension Пара "имя-значение", чтобы задать максимальный размер подпространства, который должен использоваться для формирования матричного эскиза. Эта опция может создавать матрицы, которые не удовлетворяют допуску, поскольку заданный подпространство может быть слишком маленьким. В этих случаях svdsketch возвращает матричный эскиз с максимально допустимым размером подпространства.

Использование svdsketch с допуском 1e-1 и максимальный размер подпространства 15. Задайте четвертый выход, чтобы вернуть относительную ошибку приближения.

[U3,S3,V3,apxErr] = svdsketch(double(A),1e-1,'MaxSubspaceDimension',15);

Сравните относительную ошибку приближения результата с заданным допуском. apxErr содержит один элемент с svdsketch для вычисления ответа требуется только одна итерация.

apxErr <= 1e-1
ans = logical
   0

Результат указывает, что матричный эскиз не удовлетворяет заданному допуску.

Просмотр сильно сжатого изображения ранга 15.

Anew3 = uint8(U3*S3*V3');
imshow(Anew3)
title(sprintf('Rank %d approximation',size(S3,1)))

Figure contains an axes. The axes with title Rank 15 approximation contains an object of type image.

Сравнение результатов

Наконец, для сравнения просмотрите все изображения один за другим.

tiledlayout(2,2,'TileSpacing','Compact')
nexttile
imshow(A)
title('Original')
nexttile
imshow(Anew1)
title(sprintf('Rank %d approximation',size(S1,1)))
nexttile
imshow(Anew2)
title(sprintf('Rank %d approximation',size(S2,1)))
nexttile
imshow(Anew3)
title(sprintf('Rank %d approximation',size(S3,1)))

Figure contains 4 axes. Axes 1 with title Original contains an object of type image. Axes 2 with title Rank 288 approximation contains an object of type image. Axes 3 with title Rank 48 approximation contains an object of type image. Axes 4 with title Rank 15 approximation contains an object of type image.

См. также

| |

Похожие темы