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 snownlp情感分析简易demo(分享)
Jun 04 Python
pycharm打开命令行或Terminal的方法
Jan 16 Python
对Python3 序列解包详解
Feb 16 Python
Python实现Singleton模式的方式详解
Aug 08 Python
Python实现子类调用父类的初始化实例
Mar 12 Python
python实现吃苹果小游戏
Mar 21 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
pycharm实现猜数游戏
Dec 07 Python
总结几个非常实用的Python库
Jun 26 Python
Python可视化神器pyecharts绘制地理图表
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在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
详解Vue中watch的详细用法
2018/11/28 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
es6函数中的作用域实例分析
2020/04/18 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
Python中自定义函数的教程
2015/04/27 Python
python的keyword模块用法实例分析
2015/06/30 Python
python八皇后问题的解决方法
2018/09/27 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
某公司面试题
2012/03/05 面试题
2016党员学习作风建设心得体会
2016/01/21 职场文书
如何在Python项目中引入日志
2021/05/31 Python