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 从远程服务器下载日志文件的程序
Feb 10 Python
python2.7删除文件夹和删除文件代码实例
Dec 18 Python
Python Web开发模板引擎优缺点总结
May 06 Python
用实例分析Python中method的参数传递过程
Apr 02 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
python中Switch/Case实现的示例代码
Nov 09 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
线程安全及Python中的GIL原理分析
Oct 29 Python
FP-growth算法发现频繁项集——发现频繁项集
Jun 24 Python
Python软件包安装的三种常见方法
Jul 07 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
php sprintf()函数让你的sql操作更安全
2008/07/23 PHP
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
js left,right,mid函数
2008/06/10 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
25个非常棒的jQuery滑块插件和教程小结
2011/09/02 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
vue项目中使用fetch的实现方法
2019/04/25 Javascript
js实现随机8位验证码
2020/07/24 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
Python实现类继承实例
2014/07/04 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
大学生自荐信
2013/12/11 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
一年级学生期末评语
2014/04/21 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python