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