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