python SVD压缩图像的实现代码
前言
利用SVD是可以对图像进行压缩的,其核心原因在于,图像的像素之间具有高度的相关性。
代码
#-*-coding:utf-8-*-
'''
author@cclplus
date:2019/11/3
'''
importcv2
importmatplotlibasmpl
importnumpyasnp
importmatplotlib.pyplotasplt
#转为u8类型
defrestore1(u,sigma,v,k):
m=len(u)
n=len(v)
a=np.zeros((m,n))
a=np.dot(u[:,:k],np.diag(sigma[:k])).dot(v[:k,:])
a[a<0]=0
a[a>255]=255
returnnp.rint(a).astype('uint8')
defSVD(frame,K=10):
a=np.array(frame)
#由于是彩色图像,所以3通道。a的最内层数组为三个数,分别表示RGB,用来表示一个像素
u_r,sigma_r,v_r=np.linalg.svd(a[:,:,0])
u_g,sigma_g,v_g=np.linalg.svd(a[:,:,1])
u_b,sigma_b,v_b=np.linalg.svd(a[:,:,2])
R=restore1(u_r,sigma_r,v_r,K)
G=restore1(u_g,sigma_g,v_g,K)
B=restore1(u_b,sigma_b,v_b,K)
I=np.stack((R,G,B),axis=2)
returnI
if__name__=="__main__":
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
frame=cv2.imread("./liuyifei.bmp")
I=SVD(frame,40)
plt.imshow(I)
cv2.imwrite("out.bmp",I)
原图
取二十个特征值
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。