Python NumPy灰度图像的压缩原理讲解
作者:小妮浅浅 时间:2021-02-16 02:46:33
灰度图像是对图像的颜色进行变换,如果要对图像进行压缩该怎么处理呢?
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
来源:https://www.py.cn/jishu/jichu/32049.html


猜你喜欢
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动

使用Python导出Excel图表以及导出为图片的方法

最简洁的多重查询的解决方案
Pandas统计重复的列里面的值方法
将Session值储存于SQL Server中
使用 GUID 值来作为数据库行标识讲解
python网络编程学习笔记(五):socket的一些补充
ACCESS 2007出现“错误 '80040e14'“
浅谈SQLite时间函数的使用说明与总结分析
详细分析Python垃圾回收机制

python使用matplotlib画饼状图

Python改变对象的字符串显示的方法
初学者学习Python好还是Java好
python读写修改Excel之xlrd&xlwt&xlutils

PHP保留两位小数的几种方法
编写Python脚本把sqlAlchemy对象转换成dict的教程
tensorflow中Dense函数的具体使用
浅谈Python中(&,|)和(and,or)之间的区别
