首页 > 编程 > Python > 正文

python SVD压缩图像的实现代码

2019-11-25 11:28:29
字体:
来源:转载
供稿:网友

前言

利用SVD是可以对图像进行压缩的,其核心原因在于,图像的像素之间具有高度的相关性。

代码

# -*- coding: utf-8 -*-'''author@cclplusdate:2019/11/3'''import cv2import matplotlib as mplimport numpy as npimport 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, 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)  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)

原图

取二十个特征值

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表