python

超轻量级php框架startmvc

python SVD压缩图像的实现代码

更新时间:2020-08-06 04:18:02 作者:startmvc
前言利用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, 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)

原图

取二十个特征值

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

python SVD压缩 python 压缩图像