Сжатие изображения с Низким Рангом 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)))])

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

Используйте 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)))

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)))

На этот раз, 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)))

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

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

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)))

Смотрите также

| |

Похожие темы