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简单实现enum功能的方法
Apr 25 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 Python
创建pycharm的自定义python模板方法
May 23 Python
Python操作mongodb的9个步骤
Jun 04 Python
对python sklearn one-hot编码详解
Jul 10 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
pymysql 开启调试模式的实现
Sep 24 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
Python打印不合法的文件名
Jul 31 Python
python dict如何定义
Sep 02 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 xml 入门学习资料
2011/01/01 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
webpack4从0搭建组件库的实现
2020/11/29 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
python获取当前计算机cpu数量的方法
2015/04/18 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
详解supervisor使用教程
2017/11/21 Python
python查看模块,对象的函数方法
2018/10/16 Python
Django 返回json数据的实现示例
2020/03/05 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
销售自我评价
2013/10/22 职场文书
应届护士求职信范文
2014/01/26 职场文书
商场主管竞聘书
2014/03/31 职场文书
搞笑结婚保证书
2015/05/08 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
用python修改excel表某一列内容的操作方法
2021/06/11 Python