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