Python NumPy灰度图像的压缩原理讲解


Posted in Python onAugust 04, 2021

灰度图像是对图像的颜色进行变换,如果要对图像进行压缩该怎么处理呢?

1、矩阵运算中有一个概念叫做奇异值和特征值。

设A为n阶矩阵,若存在常数λ及n维非零向量x,使得Ax=λx,则称λ是矩阵A的特征值,x是A属于特征值λ的特征向量。

一个矩阵的一组特征向量是一组正交向量。

2、即特征向量被施以线性变换 A 只会使向量伸长或缩短而其方向不被改变。

特征分解(Eigendecomposition),又称谱分解(Spectral decomposition)是将矩阵分解为由其特征值和特征向量表示的矩阵之积的方法。

假如A是m * n阶矩阵,q=min(m,n),A*A的q个非负特征值的算术平方根叫作A的奇异值。

特征值分解可以方便的提取矩阵的特征,但是前提是这个矩阵是一个方阵。如果是非方阵的情况下,就需要用到奇异值分解了。先看下奇异值分解的定义:

A=UΣVT

其中A是目标要分解的m * n的矩阵,U是一个 m * m的方阵,Σ 是一个m * n 的矩阵,其非对角线上的元素都是0。VTV^TVT是V的转置,也是一个n * n的矩阵。

奇异值跟特征值类似,在矩阵Σ中也是从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵。r是一个远小于m、n的数,这样就可以进行压缩矩阵。

通过奇异值分解,我们可以通过更加少量的数据来近似替代原矩阵。

要想使用奇异值分解svd可以直接调用linalg.svd 如下所示:

U, s, Vt = linalg.svd(img_gray)

其中U是一个m * m矩阵,Vt是一个n * n矩阵。

在上述的图像中,U是一个(80, 80)的矩阵,而Vt是一个(170, 170) 的矩阵。而s是一个80的数组,s包含了img中的奇异值。

实例代码扩展:

import numpy as np

import matplotlib.pyplot as plt

from PIL import Image
from scipy import misc
def fix_contrast(image):
minimumColor = np.amin(image)
maximumColor = np.amax(image)

#avg = (minimumColor - maximumColor)/2 first attempt

avg = np.mean(image) #second attempt
colorDownMatrix = image < avg # also tried
colorUpMatrix = image > avg

#also tried: colorUpMatrix = image > avg * 1.2
# and : colorDownMatrix = image < avg* 0.3
image = image - minimumColor*colorDownMatrix
image = image + maximumColor*colorUpMatrix
lessThen0 = image<0
moreThen255 = image>255
image[lessThen0] = 0
image[moreThen255] = 255
return image

到此这篇关于Python NumPy灰度图像的压缩原理讲解的文章就介绍到这了,更多相关Python NumPy灰度图像的压缩内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
Python使用sftp实现上传和下载功能(实例代码)
Mar 14 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
Python中如何导入类示例详解
Apr 17 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
浅析python内置模块collections
Nov 15 Python
Pytorch转onnx、torchscript方式
May 25 Python
Python虚拟环境库virtualenvwrapper安装及使用
Jun 17 Python
Python内置数据结构列表与元组示例详解
Python制作动态字符画的源码
Aug 04 #Python
Python进行区间取值案例讲解
Aug 02 #Python
Python获取江苏疫情实时数据及爬虫分析
Django对接elasticsearch实现全文检索的示例代码
Aug 02 #Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 #Python
python数字转对应中文的方法总结
Aug 02 #Python
You might like
MYSQL环境变量设置方法
2007/01/15 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
php封装的验证码类分享
2017/02/26 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
JS中的作用域链
2017/03/01 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
jQuery实现滑动开关效果
2020/08/02 jQuery
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
python线程池threadpool实现篇
2018/04/27 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
经济国贸专业求职信
2014/06/18 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
辞职信格式模板
2015/02/27 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技