1. 程式人生 > 程式設計 >python SVD壓縮影象的實現程式碼

python SVD壓縮影象的實現程式碼

前言

利用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)

原圖

取二十個特徵值

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。