用SVD压缩图片,python实现

学习了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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值