网站建设中管理员登录的代码怎么写,用什么来网站开发好,wordpress twenty twelve修改,专业网站建设维护是什么奇异值分解在图形压缩中的应用 在研究奇异值分解的工程应用之前#xff0c;我们得明白什么是奇异值#xff1f;什么是奇异向量#xff1f; 奇异值与奇异向量
概念#xff1a;奇异值描述了矩阵在一组特定向量上的行为#xff0c;奇异向量描述了其最大的作用方向。
奇异值…奇异值分解在图形压缩中的应用 在研究奇异值分解的工程应用之前我们得明白什么是奇异值什么是奇异向量 奇异值与奇异向量
概念奇异值描述了矩阵在一组特定向量上的行为奇异向量描述了其最大的作用方向。
奇异值分解(SVD) 矩阵A的分解涉及一个 m × n m \times n m×n的矩阵 Σ \Sigma Σ,其中 Σ \Sigma Σ [ D 0 0 0 ] \begin{bmatrix} D 0\\00\end{bmatrix} [D000],D是一个 r × r r\times r r×r的方阵 ( r ≤ m , r ≤ n ) ( r \leq m , r\leq n) (r≤m,r≤n) 定理设A是秩为 r r r的 m × n m\times n m×n的矩阵那么存在一个类似于 Σ \Sigma Σ的矩阵其中 D D D的对角线元素是 A A A的前 r r r个奇异值 σ 1 ≥ σ 2 ≥ σ 3 ≥ . . . ≥ σ r 0 \sigma_1 \geq\sigma_2 \geq\sigma_3 \geq... \geq\sigma_r0 σ1≥σ2≥σ3≥...≥σr0并且存在一个 m × m m\times m m×m的正交矩阵 U U U 和一个 n × n n\times n n×n的正交矩阵 V T V^T VT使得 A U Σ V T AU\Sigma V^T AUΣVT
奇异值分解计算过程
我们先假设一个矩阵 A [ 2 3 0 2 ] A \begin{bmatrix} 2 3 \\ \ 0 2\end{bmatrix} A[2 032] 设 U [ u 1 u 2 u 3 . . . ] U[u_1 u_2 u_3 ...] U[u1u2u3...] , ∑ d i a g [ σ 1 σ 2 σ 3 . . . ] \sum diag[\sigma_1 \sigma_2 \sigma_3 ...] ∑diag[σ1σ2σ3...] , V [ v 1 v 2 v 3 . . . ] T V\begin{bmatrix} v_1 \\ v_2\\ v_3 \\ ...\end{bmatrix}^T V v1v2v3... T 其中 U U U代表A的正交矩阵 ∑ \sum ∑代表A的由奇异值组成的左奇异向量矩阵 V V V代表A的右奇异向量矩阵。
求A的 U , ∑ , V U , \sum , V U,∑,V.
计算 A T A A^TA ATA A T A [ 2 0 3 2 ] [ 2 3 0 2 ] [ 13 6 6 4 ] A^TA \begin{bmatrix} 20\\32 \end{bmatrix} \begin{bmatrix} 23\\02\end{bmatrix} \begin{bmatrix} 136\\64 \end{bmatrix} ATA[2302][2032][13664]计算 A T A A^TA ATA的奇异值 σ \sigma σ σ 1 2 σ 2 2 d e t A T A 16 σ 1 2 σ 2 2 t r A T A 17 ∴ σ 1 2 16 , σ 2 2 1 ∴ σ 1 4 , σ 2 1 ∴ Σ [ 4 0 0 1 ] \sigma_1^2\sigma_2^2 det A^TA 16 \\ \sigma_1^2 \sigma_2^2 tr A^TA 17 \\ \therefore \sigma_1^2 16, \sigma_2^2 1\\ \therefore \sigma_1 4, \sigma_2 1\\ \therefore \Sigma\begin{bmatrix} 40\\01 \end{bmatrix} σ12σ22detATA16σ12σ22trATA17∴σ1216,σ221∴σ14,σ21∴Σ[4001]将 σ 1 , σ 2 \sigma_1,\sigma_2 σ1,σ2带入 A T A A^TA ATA中求其特征向量 v 1 [ 1 5 2 5 ] , v 2 [ − 2 5 1 5 ] ∴ V [ 1 5 − 2 5 2 5 1 5 ] \\ v_1 \begin{bmatrix} \frac{1}{\sqrt5} \\\\ \frac{2}{\sqrt5} \end{bmatrix} , v_2 \begin{bmatrix} -\frac{2}{\sqrt5}\\\\\frac{1}{\sqrt5} \end{bmatrix} \\\therefore V \begin{bmatrix} \frac{1}{\sqrt5}-\frac{2}{\sqrt5} \\\\ \frac{2}{\sqrt5}\frac{1}{\sqrt5}\end{bmatrix} v1 5 15 2 ,v2 −5 25 1 ∴V 5 15 2−5 25 1 构造标准正交向量 u i 1 σ i A v i ∴ u 1 1 σ 1 A v 1 1 4 [ 2 3 0 2 ] [ 1 5 2 5 ] [ 2 5 1 5 ] ∴ u 2 1 σ 2 A v 2 1 1 [ 2 3 0 2 ] [ − 2 5 1 5 ] [ − 1 5 2 5 ] ∴ U ( u 1 , u 2 ) [ 2 5 − 1 5 1 5 2 5 ] u_i\frac{1}{\sigma_i}Av_i \\ \therefore u_1\frac{1}{\sigma_1}Av_1\frac{1}{4}\begin{bmatrix} 23\\\\02\end {bmatrix} \begin{bmatrix} \frac{1}{\sqrt5} \\\\ \frac{2}{\sqrt5} \end{bmatrix} \begin{bmatrix} \frac{2}{\sqrt5}\\ \\ \frac{1}{\sqrt5} \end {bmatrix} \\ \therefore u_2\frac{1}{\sigma_2}Av_2\frac{1}{1}\begin{bmatrix} 23\\\\02\end {bmatrix} \begin{bmatrix} - \frac{2}{\sqrt5} \\\\ \frac{1}{\sqrt5} \end{bmatrix} \begin{bmatrix} -\frac{1}{\sqrt5}\\ \\ \frac{2}{\sqrt5} \end {bmatrix} \\ \therefore U(u_1,u_2)\begin{bmatrix} \frac{2}{\sqrt5} -\frac{1}{\sqrt5} \\ \\ \frac{1}{\sqrt5} \frac{2}{\sqrt5} \end{bmatrix} uiσi1Avi∴u1σ11Av141 2032 5 15 2 5 25 1 ∴u2σ21Av211 2032 −5 25 1 −5 15 2 ∴U(u1,u2) 5 25 1−5 15 2 写出表达式 A U Σ V T [ 2 5 − 1 5 1 5 2 5 ] [ 4 0 0 1 ] [ 1 5 2 5 − 2 5 1 5 ] AU\Sigma V^T\begin{bmatrix} \frac{2}{\sqrt5} -\frac{1}{\sqrt5} \\ \\ \frac{1}{\sqrt5} \frac{2}{\sqrt5} \end{bmatrix} \begin{bmatrix} 4 0 \\\\ \ 0 1\end{bmatrix} \begin{bmatrix} \frac{1}{\sqrt5} \frac{2}{\sqrt5}\\\\ -\frac{2}{\sqrt5}\frac{1}{\sqrt5}\end{bmatrix} AUΣVT 5 25 1−5 15 2 4 001 5 1−5 25 25 1 利用奇异值分解SVD进行图片压缩
首先我们先找一张图片来进行实验。
通道分离
对于JPG格式的彩色图片拥有3个颜色通道R(红)、G(绿)、B(蓝)那么可以尝试将每个颜色通道进行分离产生3个形状均为图像高 x 宽 的单通道剧展即imageRimageGimageB。
进行通道分离将imageArray数组中的每个通道分别单独取出来得到3个高 × \times × 宽的二维数组。这3个二维数组中每个位置上的取值就是对应像素的某个颜色通道的取值代码如下
import numpy as np
from PIL import ImageoriginalImage Image.open(rteriri.jpg, r)
imageArray np.array(originalImage)
R imageArray[:, :, 0]
G imageArray[:, :, 1]
B imageArray[:, :, 2]
print(R)
print(G)
print(B)运行结果如下 [[207 207 207 … 141 141 141] [207 207 207 … 141 141 141] [207 207 207 … 141 141 141] … [246 247 248 … 239 239 239] [246 247 248 … 239 239 239] [246 247 248 … 239 239 239]] [[198 198 198 … 126 126 126] [198 198 198 … 126 126 126] [198 198 198 … 126 126 126] … [233 234 235 … 235 235 235] [233 234 235 … 235 235 235] [233 234 235 … 235 235 235]] [[215 215 215 … 149 147 147] [215 215 215 … 149 147 147] [215 215 215 … 149 147 147] … [230 231 233 … 203 203 203] [230 231 233 … 203 203 203] [230 231 233 … 203 203 203]] 至此我们成功得到了3个二维ndarray数组将R、G、B三个通道成功进行了分离。
矩阵压缩
对每个单通道矩阵进行奇异值分解按照压缩的实际需要取前k个奇异值进行3个单通道的矩阵的压缩最后分别形成3个压缩后的矩阵imageRCimageGCimageBC代码如下
def imgCompress(channel,percent):U,sigma,V_T np.linalg.svd(channel)m U.shape[0]n V_T.shape[0]reChannel np.zeros((m,n))for k in range (len(sigma)):reChannel reChannel sigma[k] * np.dot(U[:,k].reshape(m,1),V_T[k,:].reshape(1,n))if float(k) / len(sigma) percent:reChannel[reChannel 0] 0reChannel[reChannel 255] 255breakreturn np.rint(reChannel).astype(unit8)图像重建
将经过奇异值分解处理的3个单通道矩阵合并从而重构出压缩后的彩色图像。 for p in [0.001, 0.005, 0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]:#p表示取所有奇异值的前多少比例reR imgCompress(R,p)reG imgCompress(G,p)reB imgCompress(B,p)reI np.stack((reR,reG,reB),2)Image.fromarray(reI).save({}.format(p)img.png)整体运行结果如下 比例为0.001至0.04 0.05至0.5 0.6至原图 总结 取前0.1%奇异值重建的图像是一个非常模糊的基本只能看到大体轮廓。取前1%奇异值重建的图像就可以看到一个比较清晰的图片了。随着比例的提升图片越来越清晰到30%的时候就基本与原图一致了。