从没感觉到线性代数的求矩阵特征值那么有用!
前言:
作为一名计算机系的学生,线性代数是一门逃不掉的学科,矩阵,矩阵,矩阵 ,计算,计算,计算! 一个晚自习算了几道矩阵题目,一对答案全错的场面历历在目,当时就想为什么要学线性代数这个无聊的学科,这样算到底有什么意思?
然而情况发生了转变,以前感觉没用的东西,现在才发现原来线性代数还可以这么玩? 啊 真香!
矩阵的特征值
学过线代的同学应该都知道这个概念,没学过的也没有关系,这个概念就可以根据字面意思进行理解,就是矩阵的特征2值吗,根据特征值可以求出特值向量,进而可以反推出矩阵本身。
做一个形象的比喻,在警察侦破案件的过程中,如果有目击者,通过目击者对嫌疑犯或者事务的描述,专业的警察就可以画出大致的画像。
那么矩阵就也是如此,根据矩阵的特征值可以反向表示出矩阵,如果有矩阵全部的特征值就可以完整的描述出矩阵,如果特征值不全那么也可以描述出一个和矩阵相似的矩阵,今天要说的就是矩阵的特征值在图像方面的应用
图像知识补充
常规的彩色图像通常我们是通过rgb去表述的,也就说计算机在存储彩色图像信息的时候会通过三维矩阵的方式来存储,但是如果我们将图片灰度化(也就是转化为黑白图片),这样我们存储的信息就会变成一个二维的矩阵。
灰度化后--------------------------------------------------------------------------------------------------------------------------
图像矩阵的特征值:
在转化过后我们可以通过np的方法获取到一个二维矩阵
import scipy.misc as sm
# 加载图像,并转化为灰度图
img = sm.imread('../da_data/preview.jpg',True)
print(img)
out:
[[36.742 35.97 34.97 ... 54.102 54.33 51.042]
[37.742 37.742 37.97 ... 54.102 53.33 51.042]
[40.34 41.112 40.34 ... 51.732 51.846 50.857]
...
[ 5.228 6.228 5.929 ... 71.666 68.954 68.242]
[ 6.228 6.228 4.929 ... 73.182 72.182 71.242]
[ 6.228 6.228 4.929 ... 69.709 71.709 74.242]]
在得到二维矩阵后可以计算特征值,之后我们抹除掉一部分的特征值,只留下150个特征值(原本有466个),通过这150个特征值去得到原来的矩阵,在将矩阵还原为图像效果如下
左边是原图,右边的由150个特征值得到的图。
下面贴出实现的代码
"""
特征值
"""
import scipy.misc as sm
import numpy as np
import matplotlib.pyplot as mp
# 加载图像
img = sm.imread('../da_data/preview.jpg',True)
# 获取特征值
original = np.mat(img)
eigvals, eigvecs = np.linalg.eig(original)
# 抹掉一部分特征值,生成新图片
eigvals[150:] = 0
dst = eigvecs * np.diag(eigvals) * eigvecs.I
# 原灰度图
mp.subplot(121)
mp.imshow(img,cmap='gray')
mp.xticks([])
mp.yticks([])
mp.tight_layout()
# 150个特征值得到的图
mp.subplot(122)
mp.xticks([])
mp.yticks([])
mp.imshow(dst.real,cmap='gray')
mp.tight_layout()
mp.show()
总结:
原先认为没有用的东西可能会在以后派上很大的用处,数学就是我们研究计算机的人最好的养料,在学习的过程中多想一想在哪里可以用到它吧。这样你会有更大的兴趣去学习,持续的学习然后成为自己心中理想的自己吧