奇异值分解是线性代数中一种重要的矩阵分解,其在图形学、统计学、推荐系统、信号处理等领域有重要应用。奇异值分解在图形压缩中的运用以及对视频进行一定的处理。
SVD和图形处理
(1)线性代数基础知识
1.特征值和特征向量,求解,特征多项式
2.相似的概念,相似对角化的概念
3.线性无关
4.可对角化,有n个线性无关的特征向量
实对称矩阵A一定可以相似对角化
5.正交,标准正交向量组,施密特正交法–正交矩阵
6.正定矩阵,半正定矩阵
(2)奇异值分解
1.奇异值矩阵
把A分成正交矩阵 * 奇异值矩阵 * 正交矩阵
其中的奇异值矩阵,和A的大小一样,主对角元素是从大到小排列的。
对于奇异值矩阵,有对角元素称为奇异值,其他位置元素为0
分别计算三个矩阵的方法
U,V利用特征值
奇异值求解,用特征值开根号
利用matlab中SVD就可以得到数据降维后的结果。
这里说的降维,更加准确来说的使得矩阵的秩减小,大小并没有改变。对应分解的矩阵的秩会变小。舍去了奇异值中值,特征值小的部分。
保留原矩阵的特征比例可以通过奇异值矩阵对角线数相加,相比就可以得到最后的结果。
(3)matlab操作
[U,S,V]=svd(A)
%注意在这里是v,而分解得到的是V的转置,所以下面需要加上转置符号
U*S*V'-A %可能会有浮点数的一点误差,近似0
然后分解成功后我们就可以进行压缩就,计算对应特征。
(4)matlab对图片的压缩
(1)原理:RGB模式
三原色:
RGB(0,0,0)黑
RGB(255,0,0)红
RGB(0,255,0)绿
RGB(0,0,255)蓝
RGB(255,255,255)白
三原色相同,纯灰
图片分为像素点,灰色图片是二维,R=G=B
彩色图片是三维RGB各一维,不能直接显示三维矩阵,需要取出来
img = double(imread(photo_address));
% 图片保存的对象是 'uint8' 类型,需要将其转换为double类型才能进行奇异值分解的操作
% 注意: img是图形的像素矩阵,如果是彩色图片则是三维矩阵,如果是灰色图片(R=G=B)则是二维矩阵
% 因此我们可利用第三个维度的大小来判断图片是否为灰色的
% 灰色图片的只有两个维度,所以size(img ,3) == 1
%rgb2gray函数可以将彩色图片转换为灰色图片, 注意:输入的变量要为默认的'uint8' 类型的图片对象
对于彩色矩阵,可以把矩阵三个色彩模式提取出来,进行拼接,其中矩阵的压缩利用svd函数,后采用cat函数进行拼接。
(5)matlab对视频的处理
实际上就是图片的叠加。
对应每一帧的图片的像素点,每秒对应的帧数
处理就是先变成图片,读出帧所在的图片的位置,然后保留这个图片。
则人脸识别就可以用这种方法,提取一幅图片,分析特征属性。
批量处理文件夹中的图片,利用循环,把文件夹中所有的图片都进行处理,找到文件下jpg结尾的文件,得到对应文件名称的文件的元胞数组。
使用时还要进行拼接得到地址,然后利用函数进行压缩,和输出即可。
video_file='test.flv';
video=VideoReader(video_file);
frame_number = video.NumberOfFrames; %视频的总帧数
%% 分离图片
for i=1:30:frame_number % 这里演示的是每30帧数保存一次
image_name=strcat('图片\image_',num2str(i),'.jpg');
% 填写对应路径
Photo=read(video,i); %读出所在帧的图片对象
imwrite(Photo,image_name); %将图片保存到指定的位置
end
(6)总结 SVD 奇异值分解
1.优点,简化数据,去除噪声点,对数据降维(减小秩)
2.缺点,转换后的数据可能不好理解
3.适用于数据类型是数值型
通过SVD对数据处理,可以对原始数据进行精简,实际上是去除了噪声和冗余信息
比较好的应用:信息检索和推荐系统.