Я новичок в 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, но я хотел бы сделать еще две вещи:
1- Показать панель изображений для различных сжатий (i/e, запустить цикл для 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
Очевидно, что есть некоторые ошибки, потому что я не получаю несколько изображений или не умею "графа" матрицы ошибок