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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。