python SVD压缩图像的实现代码

yipeiwu_com6年前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设计】。

相关文章

10分钟用python搭建一个超好用的CMDB系统

10分钟用python搭建一个超好用的CMDB系统

CMDB 是什么,作为 IT 工程师的你想必已经听说过了,或者已经烂熟了,容我再介绍一下,以防有读者还不知道。CMDB 的全称是 Configuration Management Dat...

Python Requests安装与简单运用

requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标...

django项目登录中使用图片验证码的实现方法

django项目登录中使用图片验证码的实现方法

应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color():...

使用PyInstaller将Python程序文件转换为可执行程序文件

Windows下采用PyInstall将py文件转换成exe可执行文件 好不容易写完的py文件,想做成exe文件,最开始选择用py2exe,结果生成的exe遇到两个问题, 1. py程序...

python中管道用法入门实例

本文实例讲述了python中管道用法。分享给大家供大家参考。具体如下: #!coding=utf-8 import multiprocessing def consumer(pipe...