В этом примере показано, как использовать 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)))
