SVD matlab图像处理

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×mm×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×ATAT×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 指定的帧。

猜你喜欢

转载自blog.csdn.net/weixin_44618906/article/details/104113789
SVD
今日推荐