Использование SVD для сжатия изображения в MATLAB
Я новичок в MATLAB, но пытаюсь сделать код сжатия изображений для изображений в градациях серого.
Вопросы
Как я могу использовать SVD для обрезки низкозначных собственных значений для восстановления сжатого изображения?
Работа / Попытки пока
Мой код до сих пор:
B=imread('images1.jpeg');
B=rgb2gray(B);
doubleB=double(B);
%read the image and store it as matrix B, convert the image to a grayscale
photo and convert the matrix to a class 'double' for values 0-255
[U,S,V]=svd(doubleB);
Это позволяет мне успешно разложить матрицу изображения с собственными значениями, хранящимися в переменной S.
Как мне усечь S (который 167x301, класс double)? Позволять'Скажем, из 167 собственных значений, которые я хочу взять только из первых 100 (или любых других n), как мне это сделать и восстановить сжатое изображение?
Обновленный код / мысли
Вместо того, чтобы помещать кучу кода в раздел комментариев, это мой текущий черновик. Мне удалось успешно создать сжатое изображение, изменив N вручную, но я хотел бы сделать 2 дополнительные вещи:
1 - Показать панель изображений для различных сжатий (например, запустить цикл для N = 5,10,25 и т. Д.)
2- Каким-то образом посчитайте разницу (ошибку) между каждым изображением и оригиналом и нарисуйте ее.
Я ужасен с пониманием циклов и вывода, но вот что я попробовал:
B=imread('images1.jpeg');
B=rgb2gray(B);
doubleB=im2double(B);%
%read the image and store it as matrix B, convert the image to a grayscale
%photo and convert the image to a class 'double'
[U,S,V]=svd(doubleB);
C=S;
for N=[5,10,25,50,100]
C(N+1:end,:)=0;
C(:,N+1:end)=0;
D=U*C*V';
%Use singular value decomposition on the image doubleB, create a new matrix
%C (for Compression diagonal) and zero out all entries above N, (which in
%this case is 100). Then construct a new image, D, by using the new
%diagonal matrix C.
imshow(D);
error=C-D;
end
Очевидно, есть некоторые ошибки, потому что я неполучить несколько фотографий или знать, какграфик» матрица ошибок