SVD 图像处理
奇异值分解在图形压缩中的应用
(1) 奇异值分解
A m × n = U m × m ∑ m × n V n × n T A_{m\times n}=U_{m\times m}\sum\nolimits_{m\times n}V^T_{n\times n} Am×n=Um×m∑m×nVn×nT
-
奇异值矩阵:大小和 A A A 相同,除了主对角线上元素不为 0 0 0 以外,其余位置的元素均为 0 0 0 。例如:
[ 5 0 0 0 4 0 ] \left[ \begin{matrix} 5&0&0\\ 0&4&0 \end{matrix} \right] [500400]
-
U m × m U_{m\times m} Um×m 的求解
- 计算 P = A × A T P=A\times A^T P=A×AT,这是一个 m m m 阶的对称矩阵。
- 对 P P P 进行相似对角化,并按特征值从大到小排列,就可得到 P = U B 1 U T P=UB_1U^T P=UB1UT。
-
V n × n V_{n\times n} Vn×n 的求解
- 计算 Q = A T × A Q=A^T\times A Q=AT×A,这是一个 n n n 阶的对称矩阵。
- 对 Q Q Q 进行相似对角化,并按特征值从大到小排列,就可得到 Q = V B 2 V T Q=VB_2V^T Q=VB2VT。
-
∑ m × n \sum\nolimits_{m\times n} ∑m×n 的求解
- 由于 A × A T , A T × A A\times A^T,A^T\times A A×AT,AT×A,非零特征值相同。
- 将这些非零特征值开方并从大到小填入一个和 A A A 大小相同全零矩阵,形成奇异值矩阵。
(2) 利用 SVD 对原数据进行降维
- 对原理的直观理解:
- 首先,一个矩阵是由不同的基组成的,矩阵的基通过一定规律的组合就可以将原矩阵还原,而使用 SVD 方法就是将组成矩阵的基找到, U m × m U_{m\times m} Um×m 反映的就是找到的基,而保证 U m × m U_{m\times m} Um×m 是一个正交单位矩阵,是由于正交的矩阵其基的冗余信息最少。
- 其次,每一个基在原矩阵中的“重要性”不同,而 ∑ m × n \sum\nolimits_{m\times n} ∑m×n 就反映这个权重。
- V n × n V_{n\times n} Vn×n 是一个记录基的组合方式,进而完成还原的矩阵。
- 通过保留较少的特征值,可以实现降维,注意这里的降维不是表示矩阵的大小减小,而是降低矩阵的秩。
- 计算保留原矩阵的特征比例 λ = 8.45 + 4.94 8.45 + 4.94 + 1.11 × 100 % = 92.34 % \lambda=\frac{8.45+4.94}{8.45+4.94+1.11}\times 100\%=92.34\% λ=8.45+4.94+1.118.45+4.94×100%=92.34%
(3) matlab的相关操作
1. 对单张图片的处理
① ① ① matlab 进行奇异值分解
[U,S,V]=svd(A)
,注意这里的 V
是没有进行过转置的,A
要是一个 n × n n\times n n×n 的矩阵。
② ② ② matlab 返回主对角线元素 P=diag(A)
③ ③ ③ matlab 读入图片
img=imread(图片地址)
,注意这样读出来的是一个 uint8 类型的矩阵,要转化成 double 型的才能进行 SVD 操作。
④ ④ ④ matlab 转化为灰色图片 I = rgb2gray(A)
⑤ ⑤ ⑤ matlab 将 RGB 三个颜色矩阵整合成一个 img=cat(3,r,g,b)
⑥ ⑥ ⑥ matlab 保存图片
imwrite(uint8(A), 保存地址)
,注意这里要把颜色矩阵转化回 uint8。
2. 对文件夹中的图片批量处理
① ① ① matlab 将文件名拼接
fullfile('dir1', 'dir2', ..., 'filename')
f = fullfile('dir1', 'dir2', ..., 'filename')
具体例子:
输入:f = fullfile('C:','User','matlab','matlab.m')
得到:f =C:\User\matlab\matlab.m
② ② ② matlab 文件结构数组
dirOutput=dir('正则表达式');
dirOutput =
包含以下字段的 struct 数组:
name
folder
date
bytes
isdir
datenum
3. 视频处理
① ① ① matlab 读取视频文件
VideoObj=VideoReader(视频文件的地址)
VideoReader - 属性:
Name - 视频文件名
Path - 视频文件路径
Duration - 视频的总时长(秒)
FrameRate - 视频帧速(帧/秒)
NumberOfFrames - 视频的总帧数
Height - 视频帧的高度
Width - 视频帧的宽度
BitsPerPixel - 视频帧每个像素的数据长度(比特)
VideoFormat - 视频的类型, 如 'RGB24'.
Tag - 视频对象的标识符,默认为空字符串''
Type - 视频对象的类名,默认为'VideoReader'.
② ② ② matlab 读取指定帧 video = read(v,index) 只读取 index 指定的帧。