用SVD压缩图片,python实现

文章介绍了如何利用SingularValueDecomposition(SVD)对图像进行矩阵分解,提取主要特征信息以实现图像压缩。通过Python代码展示了SVD在RGB通道上分别应用的过程,随着保留特征值(r)的数量增加,图像从高度压缩逐渐恢复细节。
摘要由CSDN通过智能技术生成

学习了svd,了解到矩阵可以拆分成三个特定矩阵的相乘

A = UDV^{T}

 其中,D是对角矩阵,U和V均为酉矩阵

取前r个大的特征值,可以获取图像大部分的特征信息,从而对图像进行压缩。

如下图

在python测试了svd,并用一张图像测试了效果,如下图原图

r=5

 r=15

 r=25

 r=35

r=45

 python代码如下

from numpy import mat,eye
import numpy as np
from skimage import io,data

img=data.chelsea()
print(img.shape)
img=img/255
io.imshow(img)
io.show()


R,G,B=img[:,:,0],img[:,:,1],img[:,:,2]

UR,SR,VR=np.linalg.svd(R)
UG,SG,VG=np.linalg.svd(G)
UB,SB,VB=np.linalg.svd(B)

def getSVDimage(U,S,V,count):
    dig=mat(eye(count)*S[:count]) #获得对角矩阵
    redata=U[:,:count]*dig*V[:count,:]
    return redata

for k in range(5,80,10):
    r1=getSVDimage(UR,SR,VR,k)
    g1=getSVDimage(UG,SG,VG,k)
    b1=getSVDimage(UB,SB,VB,k)
    img_new = np.zeros(img.shape)
    img_new[:, :, 0] = r1
    img_new[:, :, 1] = g1
    img_new[:, :, 2] = b1

    io.imshow(img_new)
    io.show()

    imgimg = np.maximum(img_new,0)
    imgsave=np.uint8(imgimg*255)
    io.imsave("SVD_cat_k"+str(k)+".bmp",imgsave)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值