python SVD压缩图像的实现代码

yipeiwu_com7年前Python基础

前言

利用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设计】。

相关文章

python使用matplotlib绘图时图例显示问题的解决

python使用matplotlib绘图时图例显示问题的解决

前言 matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。在使用Python matplotlib库绘制数据图时,需要使用图例标注数据类别,但是传...

python 将json数据提取转化为txt的方法

如下所示: #-*- coding: UTF-8 -*- import json import pymysql import os import sys # 数据类型 # { #...

关于sys.stdout和print的区别详解

关于sys.stdout和print的区别详解

一、sys.stdout的形式就是print的一种默认输出格式,等于print "%VALUE%" print函数是对sys.stdout的高级封装,看下print函数的解释 Pri...

对dataframe数据之间求补集的实例详解

python的pandas库,对于dataframe数据,有merge命令可以完成dataframe数据之间的求取交集并集等命令。 若存在df1与df2 ,他们的交集df3=pd.mer...

python提取具有某种特定字符串的行数据方法

python提取具有某种特定字符串的行数据方法

今天又帮女朋友处理了一下,她的实验数据,因为python是一年前经常用,最近找工作,用的是c,c++,python的有些东西忘记了,然后就一直催我,说我弄的慢,弄的慢,你自己弄啊,烦不烦...