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 解析XML文件
Apr 15 Python
Python入门篇之列表和元组
Oct 17 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
python 执行终端/控制台命令的例子
Jul 12 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
pandas分组聚合详解
Apr 10 Python
Python实现爬取并分析电商评论
Jun 19 Python
用python实现学生管理系统
Jul 24 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 Python
Python极值整数的边界探讨分析
Sep 15 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
招股说明书范本
2014/05/06 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
订货会主持词
2015/07/01 职场文书
辞职离别感言
2015/08/04 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技
详解MySQL的内连接和外连接
2023/05/08 MySQL