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*n
    eigs = 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,就退出循环
            break
        end
    end
    disp(['压缩后保留原矩阵的比例特征为:',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=0
        greycompress = 0;
    end
    
    img = double(imread(photo_address));
    % 图片保存的对象是 'uint8' 类型,需要将其转换为double类型才能进行奇异值分解的操作
    % 注意:  img是图形的像素矩阵,如果是彩色图片则是三维矩阵,如果是灰色图片(R=G=B)则是二维矩阵
    % '赫本.jpg'是灰色的图片,得到的img类型是[914×1200]double
    % '千与千寻.jpg'是彩色的图片,得到的img类型是[768×1024×3]double
    % 因此我们可利用第三个维度的大小来判断图片是否为灰色的
    % 灰色图片的只有两个维度,所以size(img ,3) == 1
 
    if (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矩阵压缩成r
        disp(['正在压缩:  ',photo_address,'的绿色要素'])
        g = mysvd(G, ratio); % 调用自定义函数将G矩阵压缩成g
        disp(['正在压缩:  ',photo_address,'的蓝色要素'])
        b = mysvd(B, ratio); % 调用自定义函数将B矩阵压缩成b
        compress_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从数据中构建一个主题空间,然后再在该空间下计算相似度,以此提高推荐的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值