python SVD壓縮影象的實現程式碼
阿新 • • 發佈:2020-01-09
前言
利用SVD是可以對影象進行壓縮的,其核心原因在於,影象的畫素之間具有高度的相關性。
程式碼
# -*- coding: utf-8 -*- ''' author@cclplus date:2019/11/3 ''' import cv2 import matplotlib as mpl import numpy as np import matplotlib.pyplot as plt #轉為u8型別 def restore1(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 return np.rint(a).astype('uint8') def SVD(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,v_r,K) G = restore1(u_g,v_g,K) B = restore1(u_b,v_b,K) I = np.stack((R,G,B),axis = 2) return I 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)
原圖
取二十個特徵值
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。