SVD用于图形处理★★★
该博客为个人学习清风建模的学习笔记,代码全部摘自清风老师,部分课程可以在B站:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili
目录
1线性代数基础回顾
1.1特征值和特征向量的定义
1.2特征值和特征向量的求法
1.3相似和相似对角化
1.4标准正交向量组的定义
1.5施密特正交化
1.6正交矩阵
1.7正定矩阵
2奇异值分解
2.1三个引理
2.2概念
2.3计算U
2.4计算V
2.5计算奇异值
2.6SVD证明
2.7SVD降维
2.8保留原矩阵的特征比例
2.9MATLAB进行奇异值分解
2.10自定义的mysvd函数
3图形处理
3.1RGB
3.2单张图片压缩
3.3视频分离成图片
3.4批量处理图片
4总结
名称 | 重要性 | 难度 |
SVD用于图形处理 | ★★★ | ★★★★ |
1线性代数基础回顾
1.1特征值和特征向量的定义
1.2特征值和特征向量的求法
1.3相似和相似对角化
1.4标准正交向量组的定义
1.5施密特正交化
1.6正交矩阵
1.7正定矩阵
2奇异值分解
2.1三个引理
2.2概念
2.3计算U
2.4计算V
2.5计算奇异值
2.6SVD证明
2.7SVD降维
注:这⾥所说的降维,更准确的来说是使得矩阵的秩减小,矩阵大小并未改变
2.8保留原矩阵的特征比例
2.9MATLAB进行奇异值分解
A = [4 0 1 6;0 0 5 1;2 1 3 2] % A : 3*4
[U,S,V] = svd(A) % 注意:U*S*(V的转置) == A U:3*3 S:3*4 V : 4*4
2.10自定义的mysvd函数
% 主函数
A = [4 0 1 6;0 0 5 1;2 1 3 2] % A : 3*4
mysvd(A, 0.9)
function [compress_A] = mysvd(A, ratio)% 函数作用:使用奇异值分解将矩阵A压缩到指定的特征比例% 输入变量% A:要压缩的m*n维的矩阵% ratio:要保留原矩阵的特征比例(100%表示不压缩)% 输出变量% compress_A: 压缩后的矩阵[U,S,V] = svd(A); % U:m*m S:m*n V : n*neigs = diag(S); % diag函数可以返回S的主对角线元素,即矩阵A的奇异值,并将其保存到列向量中SUM = sum(eigs); % 计算所有奇异值的总和temp = 0; % 新建临时变量,用于下面的循环for i = 1: length(eigs) % 循环temp =temp + eigs(i); % 每循环一次,就更新temp的值为原来的temp值+接下来的一个奇异值if (temp/SUM) > ratio % 如果现在的比例超过了ratio,就退出循环breakendenddisp(['压缩后保留原矩阵的比例特征为:',num2str(round(100*temp/SUM,2)),'%']) %round(x,2)可将x四舍五入到小数点后两位compress_A= U(:,1:i)*S(1:i,1:i)*V(:,1:i)';
end
3图形处理
3.1RGB
RGB 色彩就是常说的三原色, R 代表 Red (红色), G 代表 Green (绿色), B代表Blue (蓝色)。自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成。
3.2单张图片压缩
clc;clear
photo_compress('千与千寻.jpg', 'compress_gray_千与千寻.jpg', 0.8, 1); % 先转换为灰色图片后再压缩
function []= photo_compress(photo_address, save_address, ratio, greycompress)% 函数作用:利用SVD对图形进行压缩% 输入变量% photo_address:要压缩的图片存放的位置(建议输入完整的路径)% save_address:将压缩后的图片保存的位置(建议输入完整的路径)% ratio:要保留原矩阵的特征比例(100%表示不压缩)% greycompress: 如果该值等于1,则会彩色的原图片转换为灰色图片后再压缩;默认值为0,表示不进行转换% 输出变量% 无(不需要输出,因为函数运行过程中已经将图片保存了~)if nargin == 3 % 判断用户输入的参数,如果只输入了前三个参数,则默认最后的参数greycompress=0greycompress = 0;endimg = double(imread(photo_address));% 图片保存的对象是 'uint8' 类型,需要将其转换为double类型才能进行奇异值分解的操作% 注意: img是图形的像素矩阵,如果是彩色图片则是三维矩阵,如果是灰色图片(R=G=B)则是二维矩阵% '赫本.jpg'是灰色的图片,得到的img类型是[914×1200]double% '千与千寻.jpg'是彩色的图片,得到的img类型是[768×1024×3]double% 因此我们可利用第三个维度的大小来判断图片是否为灰色的% 灰色图片的只有两个维度,所以size(img ,3) == 1if (greycompress == 1) && (size(img ,3) == 3) % 如果图片为彩色,且greycompress的值等于1,则会彩色的原图片转换为灰色图片后再压缩img = double(rgb2gray(imread(photo_address))); % rgb2gray函数可以将彩色图片转换为灰色图片, 注意:输入的变量要为默认的'uint8' 类型的图片对象end % 注意: grey(英)和gray(美)都表示灰色if size(img ,3) == 3 % 判断图片是否为彩色的R=img(:,:,1); % RGB色彩模式三要素:红色G=img(:,:,2); % RGB色彩模式三要素:绿色B=img(:,:,3); % RGB色彩模式三要素:蓝色disp(['正在压缩: ',photo_address,'的红色要素'])r = mysvd(R, ratio); % 调用自定义函数将R矩阵压缩成rdisp(['正在压缩: ',photo_address,'的绿色要素'])g = mysvd(G, ratio); % 调用自定义函数将G矩阵压缩成gdisp(['正在压缩: ',photo_address,'的蓝色要素'])b = mysvd(B, ratio); % 调用自定义函数将B矩阵压缩成bcompress_img=cat(3,r,g,b); % 根据三个RGB矩阵(压缩后的r、g、b)生成图片对象else % 如果图片是灰色的要执行的步骤disp(['正在压缩灰色图片: ',photo_address])compress_img = mysvd(img, ratio); %如果是灰色图片的话,直接压缩img矩阵就好了end% 将压缩后的图片保存imwrite(uint8(compress_img), save_address); % 如果你的矩阵是double格式的,导出时会自动将范围认为是[0 1],需要重新转换为uint8类型end
3.3视频分离成图片
3.4批量处理图片
4总结
SVD(奇异值分解):
1.优点:简化数据,去除噪声点,对数据降维(减少秩);
2.缺点:数据的转换可能难以理解;
3.适用于数据类型:数值型。
通过SVD对数据的处理,我们可以对原始数据进行精简,这样做实际上是去除了噪声和冗余信息,以此达到了优化数据的目的。
SVD 的另外两个重要应用:
潜在语义索引: 最早的 SVD 应用之一就是信息检索,我们称利用 SVD 的方法为潜在语义检索(LSI )或隐形语义分析( LSA ),有兴趣可以去阅读吴军老师的《数学之美》。
推荐系统: SVD 的另一个应用就是推荐系统,较为先进的推荐系统先利用SVD从数据中构建一个主题空间,然后再在该空间下计算相似度,以此提高推荐的效果