矩阵实验

  • 矩阵
    • 工程应用:图像平滑
  • 看待矩阵的四种视角:数据、系统、变换、空间
    • 线性变换
      • 工程应用:图形变化
      • 矩阵变化的推导
  • 总结

矩阵

在线性代数里,用的最多的概念是【矩阵】。

一个具体的矩阵:


一个抽象的矩阵:

矩阵,是把数字按照横竖排起来。

  • 您看上图,前一个是 333 行 555 列 (3∗53*53∗5),后一个是 333 行 444 列 (3∗43*43∗4)。

来源:向量的扩展,向量是横着的一排数字,每个数字代表一个维度的分量。

  • 比方说,学生的考试科目,是有 NNN 个维度。

    那在年纪成绩评比时,通常是按所有维度算的 -> V1=(语文、数学、英语、理科、文科)V1 = (语文、数学、英语、理科、文科)V1=(语文、数学、英语、理科、文科)

    而评比单科王是按一个维度算的 -> V2=(语文或数学或英语或...)V2 = (语文 ~或~ 数学 ~或~ 英语~ 或...)V2=(语文 或 数学 或 英语 或...)

    还有一些可能只是按基础算 -> V3=(语文、数学、英语)V3 = (语文、数学、英语)V3=(语文、数学、英语)

    V3=(8,9,7)V3 = (8, 9, 7)V3=(8,9,7),可以用来计算和某个候选人的相似性。

    每一个评比的要求都是一个向量,而又有这么多评比,所以就有了 V1、V2、......、VnV1、V2、......、VnV1、V2、......、Vn。

    这么多向量如果把它们放在一起,该怎么排列呢?


    如同所示,这种把向量按照横竖排起来的摆放方式,是很自然的结果,只不过数学家给它取了一个名字:矩阵,并且发现了一系列相应的计算

所以说,矩阵就是把向量按照横竖排起来的摆放方式而得来的,矩阵不是原因,而是结果,矩阵产生的原因就是向量的扩展。

作用,是将以前的单个计算(俩个元素的加减乘除)变成了批处理(俩个矩阵的加减乘除)。

如:

  • 俩个元素之间的计算:3∗4=123 * 4 = 123∗4=12
  • 俩个矩阵之间的批处理:(125346)∗(123456)=(1∗13∗22∗34∗45∗56∗6)=(166162536)\begin{pmatrix} 1 &2 &5 \\ 3 &4 &6 \\ \end{pmatrix}*\begin{pmatrix} 1 &2 \\ 3 &4 \\ 5 &6 \end{pmatrix}=\begin{pmatrix} 1*1 &3*2 \\ 2*3 &4*4 \\ 5*5 &6*6 \end{pmatrix} = \begin{pmatrix} 1 &6 \\ 6 &16 \\ 25 &36 \end{pmatrix}(13​24​56​)∗⎝⎛​135​246​⎠⎞​=⎝⎛​1∗12∗35∗5​3∗24∗46∗6​⎠⎞​=⎝⎛​1625​61636​⎠⎞​

正是这种计算方式,将以前的单个计算(俩个元素的加减乘除)变成了批处理(俩个矩阵的加减乘除)。

这种批处理的计算,与计算机搭配起来,简直是绝配 — 所以,线性代数对于我们来说,生活和工作都能用上。

运算:矩阵加法、矩阵数乘、矩阵乘法。

  • 矩阵加法:[123456]+[111111]=[234567]\begin{bmatrix} 1 & 2 &3 \\ 4&5 &6 \end{bmatrix} + \begin{bmatrix} 1 & 1 &1 \\ 1& 1 & 1 \end{bmatrix} = \begin{bmatrix} 2 & 3 &4 \\ 5&6 &7 \end{bmatrix}[14​25​36​]+[11​11​11​]=[25​36​47​],前提是俩个相加的矩阵的行列相同

  • 矩阵数乘:n∗[123456]=[n2n3n4n5n6n]n*\begin{bmatrix} 1 & 2 &3 \\ 4&5 &6 \end{bmatrix}=\begin{bmatrix} n & 2n &3n \\ 4n&5n &6n \end{bmatrix}n∗[14​25​36​]=[n4n​2n5n​3n6n​]

  • 矩阵乘法:[123456789101112]∗[271236]=[1∗2+2∗1+3∗31∗7+2∗2+3∗64∗2+5∗1+6∗34∗7+5∗2+6∗67∗2+8∗1+9∗37∗7+8∗2+9∗610∗2+11∗1+12∗310∗7+11∗2+12∗6]\begin{bmatrix} 1 & 2& 3\\ 4 & 5 & 6\\ 7& 8 & 9\\ 10&11 &12 \end{bmatrix}*\begin{bmatrix} 2 & 7\\ 1& 2\\ 3&6 \end{bmatrix} = \begin{bmatrix} 1*2+2*1+3*3 &1*7+2*2+3*6 \\ 4*2+5*1+6*3 &4*7+5*2+6*6 \\ 7*2+8*1+9*3 &7*7+8*2+9*6 \\ 10*2+11*1+12*3 &10*7+11*2+12*6 \end{bmatrix}⎣⎢⎢⎡​14710​25811​36912​⎦⎥⎥⎤​∗⎣⎡​213​726​⎦⎤​=⎣⎢⎢⎡​1∗2+2∗1+3∗34∗2+5∗1+6∗37∗2+8∗1+9∗310∗2+11∗1+12∗3​1∗7+2∗2+3∗64∗7+5∗2+6∗67∗7+8∗2+9∗610∗7+11∗2+12∗6​⎦⎥⎥⎤​

    第一个矩阵的形状是 4∗34*34∗3,第二个矩阵的形状是 3∗23*23∗2 ,俩俩相乘的矩阵是 4∗24*24∗2,中间的 333 被划掉了 ---- 因此俩个矩阵相乘需要满足一个条件,乘号前的矩阵的 列数 要等于后面矩阵的 行数

    矩阵乘法很重要吧,我在编程时经常听别人说起,况且那时候并没有学工程数学。

    1. 先确定生成矩阵的尺寸,乘号前的矩阵的 列数 要等于后面矩阵的 行数
    2. 生成矩阵的第 iii 行第 jjj 列的值为:前面矩阵第 iii 行 和 后面矩阵第 jjj 列的点乘/内积,就是一一对应,每个数字相乘再相加。

    矩阵乘法就 333 种情况,和数字、和向量、和矩阵 相乘。

  • 矩阵卷积(二维):矩阵BBB 以某个步长在 矩阵AAA 表面 滑动加权求和

    演示一下卷积过程,

    接着矩阵 BBB 从矩阵 AAA 的 左上角 准备滑动,如下图:


    黄色区域的元素相乘,得到 444 个 111,相加值为 444。

    假设设定的滑动步长为 111 ,开始滑动,新一轮计算,方法相同,如下图:


    继续滑动,对应位置相乘再求和得到 444,如下图:


    继续滑动,对应位置相乘再求和得到 2,如下图:


    …,最终矩阵卷积生成的矩阵,对比 矩阵AAA 生成的矩阵小了一圈,如下图:


    矩阵BBB (小矩阵),也被称为“卷积核”、“滤波器”;矩阵卷积也是卷积神经网络的原理。


工程应用:图像平滑

上面所说的矩阵卷积是二维的,因此我们以灰色图为例,彩色图是三维的。

图片是由很多 0−2550-2550−255 的值排列而成,像素值越大图片就越亮;

  • 如果像素是 000,那像素即黑色;
  • 如果像素是 255255255,那像素即白色;

而矩阵正好有行、列,我们可以把图片转为矩阵,通过操控矩阵来改变图片。

图片平滑:让一张清晰的图片变模糊

因为图片的像素值反应了一个图片的亮度,如果我们把图片中的像素值和周围的像素值相似,那整个图片的色调就差不多,也变模糊了。

而图片平滑的过程和矩阵卷积的过程是一样的,最核心的地方就是设计卷积核

图像平滑算法:

  1. 设计一个卷积核,使得图像矩阵的每一个像素值尽可能的与周围的像素值接近,这张图片每部分就会差不多;
  2. 积核尺寸、滑动步长、周边范围等超参数设计,以需求而定;
  3. 需要考虑一个细节,矩阵卷积生成的矩阵会缩小一圈,图片也会变小一圈;解决方法是在矩阵A最外围补一圈零。
# 运行:在命令行输入 python 当前源文件.py
import numpy as np
from PIL import Image                     # 图片处理模块
from scipy import signal# 1.读取一张图片
filename = "./demo.png"
img_rgb = Image.open(filename)
img_rgb.show()# 2.将彩色图片转为灰度图
img_gray = img_rgb.convert('L')
img_gray.show()# 3.将灰度图转为像素矩阵
matrix = np.asarray(img_gray)
print("matrix.shape=", matrix.shape)  # 4.定义卷积核(均值滤波器)
filter_3x3 = np.array([[ 1/9, 1/9, 1/9 ],[ 1/9, 1/9, 1/9 ],[ 1/9, 1/9, 1/9 ]])print("filter_3x3=", filter_3x3.shape)      # 采用的 3*3 的过滤器
print(np.around(filter_3x3, decimals=2))   # 打印图片的像素值# 5.开始卷积(图像平滑)
result = signal.convolve2d(matrix, filter_3x3, mode='same')
print("result.shape=", result.shape)
print(np.around(result, decimals=0))# 6.把像素矩阵转回图片
img_rlt = Image.fromarray(result)
img_rlt.show()

读取的图片 demo.png


简单起见,转为黑白图片(二维):


调用图像平滑算法:


有些模糊了,但 3x33x33x3 可能不太明显,可以改为 7x77x77x7 看看(会更模糊)。

  • filter_3x3 改为 filter_7x7
# 7x7的,均值是 1/49
filter_7x7 = np.ones((7,7)) / (7*7)

除此之外,卷积核还可以改进,一般采用高斯分布(在保留细节方面,图片平滑效果最好),因此也称为 “高斯滤波器”。

二维高斯分布:

在 3∗33*33∗3 的 矩阵BBB 中,也就是卷积核的权重不要全设置为相同的数;滤波器的设计应该随中心逐层递减。

# 7x7 高斯滤波器
gaussian_filter_7x7 = np.array([  [ 0.00000067, 0.00002292, 0.00019117, 0.00038771, 0.00019117, 0.00002292, 0.00000067],[ 0.00002292, 0.00078633, 0.00655965, 0.01330373, 0.00655965, 0.00078633, 0.00002292],[ 0.00019117, 0.00655965, 0.05472157, 0.11098164, 0.05472157, 0.00655965, 0.00019117],[ 0.00038771, 0.01330373, 0.11098164, 0.22508352, 0.11098164, 0.01330373, 0.00038771],[ 0.00019117, 0.00655965, 0.05472157, 0.11098164, 0.05472157, 0.00655965, 0.00019117],[ 0.00002292, 0.00078633, 0.00655965, 0.01330373, 0.00655965, 0.00078633, 0.00002292],[ 0.00000067, 0.00002292, 0.00019117, 0.00038771, 0.00019117, 0.00002292, 0.00000067] ])# 调用的时候,将 filter_3x3 改为 gaussian_filter_7x7。

除此之外,还可以实现图片的边缘检测(应用在自动驾驶的车道检测、计算机视觉基础等等)。

# 第 4 步,定义卷积核改为定义算子
sobel = np.array([[ -1, -2, -1 ],                        [  0,  0,  0 ],[  1,  2,  1 ]]) # 调用语句 result = signal.convolve2d(matrix, filter_3x3, mode='same')
result = signal.convolve2d(matrix, sobel, mode='same')

左边是原图,右边是效果图(边缘检测算法):


看待矩阵的四种视角:数据、系统、变换、空间

学线代时,可能比较注重具体的计算,但学完了却发现对线代的理解还是不够深刻。

一个可能的原因是,没有特别深刻的理解,我们在代数中的这些符号,比如说 矩阵AAA,这个 矩阵AAA 到底表示什么?

代数,是用字母代表数,但我们到底代表的是哪些数…在更加抽象的数学里,我们的代数代表的不仅仅是数,而是一个对象。

那么,代表的这个对象是什么?

这个就是我们要明确的。

看待矩阵的四种视角:

  • 数据:把矩阵看成数据,nnn行mmm列,每一行代表一个样本,每一列代表一个特征,多用于数据科学;
  • 系统:把矩阵看成线性系统(中学的多元一次方程组),那求解那些线性方程组就可以用矩阵运算,多用于计算线性代数的线性方程组;
  • 变换:把矩阵看成对向量的一个函数,或者说是一种变换,因为一个矩阵和一个向量相乘,得到结果依然是向量,可以把矩阵看成输入一个向量,输出一个向量的函数,多用于图形学的图像图形的变化;
  • 空间:把矩阵看成一个空间,这样看一个矩阵乘一个向量,就是向量在矩阵所表示的空间中所对应的位置是哪里,多用于线性代数的向量空间。

线性变换

矩阵可不仅仅是只能处理图片的数字表格,试着换一种角度看矩阵:变换。

  • 矩阵乘法:A∗B=[1−111]∗[11]=[02]A*B=\begin{bmatrix} 1 & -1\\ 1& 1 \end{bmatrix}*\begin{bmatrix} 1\\ 1 \end{bmatrix} = \begin{bmatrix} 0\\ 2 \end{bmatrix}A∗B=[11​−11​]∗[11​]=[02​],画在几何。


向量B向量B向量B(红色) 经过 矩阵A矩阵A矩阵A 得到 另一个向量(绿色),矩阵A矩阵A矩阵A 如同一个函数,一个向量输入进去,会输出另一个向量。

只不过,在线性代数里,我们称 矩阵A矩阵A矩阵A 为一种变换,即把一个向量(或矩阵)变成另一个变量(或矩阵)。

若我们把矩阵看做一个变换,图形变换就会十分方便。

图形变换:图形的缩放、旋转、仿射等等,也用于游戏开发、动漫制作等等。


工程应用:图形变化

或许您应该有一个疑问,矩阵,是怎样实现图形变换的 ???

图形的变化:

  • 图形旋转
  • 图形平移
  • 图形放大
  • 图形缩小
  • 图形翻转
  • 图形剪切(正体 变斜体
  • … …

比如,这个是怎么做到的:


经过旋转:


先考虑一个小问题吧,怎么使得一个图形绕 yyy 轴左右翻转 ?


其实,黄色的梯形是由 444 个点组成,经历 444 个点的坐标,也就是 444 个列向量。

首先,我们让 (x1,y1)(x_{1},y_{1})(x1​,y1​) 翻转,翻转后也就是 (−x1,y1)(-x_{1},y_{1})(−x1​,y1​)。

现在我们改为以矩阵的形式翻转:A∗[x1y1]=[−x1y1]A*\begin{bmatrix} x_{1}\\ y_{1} \end{bmatrix}=\begin{bmatrix} -x_{1}\\ y_{1} \end{bmatrix}A∗[x1​y1​​]=[−x1​y1​​]

我们需要做的就是找到一个能使其转换完成的 矩阵A矩阵A矩阵A,因为输入的矩阵和输出的矩阵都是同行同列(2行, 1列),根据矩阵乘法的要求,矩阵A矩阵A矩阵A 就必须是 2行, 2列。

得到一个式子:

  • 令 A=[abcd],A=\begin{bmatrix} a & b \\ c & d \end{bmatrix},A=[ac​bd​], 则有:{ax1+by1=−x1cx1+dy1=y1\begin{cases} ax_{1} +by_{1}&= -x_{1}\\ cx_{1}+dy_{1}&= y_{1} \end{cases}{ax1​+by1​cx1​+dy1​​=−x1​=y1​​

我们确定好 a,b,c,da,b,c,da,b,c,d 四个系数的值,通过比对等式俩边的系数即可,

  • 因为 −x1=ax1-x_{1} = ax_{1}−x1​=ax1​ ,推出 a=−1,b=0a = -1, ~b=0a=−1, b=0;
  • 因为 y1=dy1y_{1}=dy_{1}y1​=dy1​, 推出 c=0,d=1c=0,~d=1c=0, d=1;

所以,矩阵 A=[−1001]A =\begin{bmatrix} -1 & 0 \\ 0& 1 \end{bmatrix}A=[−10​01​]。

可这个翻转计算只是针对 (x1,y1)(x_{1},y_{1})(x1​,y1​),为了提高计算效率(批处理),我们把 x1⋯xnx_{1}\cdots x_{n}x1​⋯xn​ 的点化为列向量后,排成一个矩阵。

矩阵AAA 再和 排成的矩阵 计算即可:

  • [−1001]∗[x1x2x3x4y1y2y3y4]=[−x1−x2−x3−x4y1y2y3y4]\begin{bmatrix} -1 &0 \\ 0& 1 \end{bmatrix}*\begin{bmatrix} x_{1} & x_{2} & x_{3} & x_{4} \\ y_{1} & y_{2} & y_{3} & y_{4} \end{bmatrix}=\begin{bmatrix} -x_{1} & -x_{2} & -x_{3} & -x_{4} \\ y_{1} & y_{2} & y_{3} & y_{4} \end{bmatrix}[−10​01​]∗[x1​y1​​x2​y2​​x3​y3​​x4​y4​​]=[−x1​y1​​−x2​y2​​−x3​y3​​−x4​y4​​]

以上是图形的左右翻转(绕 yyy 轴)。


图形的上下翻转(绕 xxx 轴)原理也相同。

  • [−1001]∗[x1x2x3x4y1y2y3y4]=[x1x2x3x4−y1−y2−y3−y4]\begin{bmatrix} -1 &0 \\ 0& 1 \end{bmatrix}*\begin{bmatrix} x_{1} & x_{2} & x_{3} & x_{4} \\ y_{1} & y_{2} & y_{3} & y_{4} \end{bmatrix}=\begin{bmatrix} x_{1} & x_{2} & x_{3} & x_{4} \\ -y_{1} & -y_{2} & -y_{3} & -y_{4} \end{bmatrix}[−10​01​]∗[x1​y1​​x2​y2​​x3​y3​​x4​y4​​]=[x1​−y1​​x2​−y2​​x3​−y3​​x4​−y4​​]

线性变换,也可以实现图形的水平剪切。

剪切:把 正体字 变成 斜体字,就是一个剪切。


图形的水平剪切如上图,纵坐标不变,横坐标运动。

结合矩阵:[abcd]∗[xy]=[x+kyy]\begin{bmatrix} a &b \\ c & d \end{bmatrix}*\begin{bmatrix} x\\y \end{bmatrix}=\begin{bmatrix} x+ky\\ y \end{bmatrix}[ac​bd​]∗[xy​]=[x+kyy​],有一个控制系数 kkk.

根据矩阵乘法 ,令 A=[abcd],A=\begin{bmatrix} a & b \\ c & d \end{bmatrix},A=[ac​bd​], 则有:{ax+by=x+kycx+dy=y\begin{cases} ax+by&= x+ky\\ cx+dy&= y \end{cases}{ax+bycx+dy​=x+ky=y​

通过对比系数,[1k01]∗[xy]=[x+kyy]\begin{bmatrix} 1 &k \\ 0 & 1 \end{bmatrix}*\begin{bmatrix} x \\ y \end{bmatrix}= \begin{bmatrix} x+ky \\ y \end{bmatrix}[10​k1​]∗[xy​]=[x+kyy​],当 k>0k>0k>0 时,往右剪切;当 k<0k<0k<0 时,往左剪切。


图形的竖直剪切如下图,纵坐标运动,横坐标不变。


 
变换矩阵:[1k01]∗[xy]=[xkx+y]\begin{bmatrix} 1 &k \\ 0 & 1 \end{bmatrix}*\begin{bmatrix} x \\ y \end{bmatrix}= \begin{bmatrix} x \\ kx+y \end{bmatrix}[10​k1​]∗[xy​]=[xkx+y​],注意 kkk 的值,变换的方向不一样。


完整代码:

# 运行:在命令行输入 python 当前源文件.py
import numpy as np
import matplotlib.pyplot as plt# 1.定义变换矩阵A,用于图形平移(竖直平移)
A = np.array([[1,0],[0,-1]])# 1.定义变换矩阵A,用于图形剪切
# k = -0.8
# A = np.array([[1,0],[k,1]])# 1.定义变换矩阵A,图形旋转
# theta = -(3.14/4)
# A = np.array([[np.cos(theta),np.sin(theta)],[-np.sin(theta),np.cos(theta)]])# 1.定义变换矩阵A,图形整体放大 1 倍
# A = np.array([[2,0],[0,-2]])  # 1.定义变换矩阵A,图形整体缩小 0.75 倍
# A = np.array([[0.5,0],[0,0.5]])  # 2. 定义输入矩阵(即输入图形)
B = np.array([[0, 1, 1, 0, 0],[1, 1, 0, 0, 1]])# 3. 计算输出矩阵(矩阵乘法)
Y = np.dot(A,B)# 4. 绘制图形
plt.axis([-3,3,-3,3])
plt.axvline(x=0, color='#A9A9A9')
plt.axhline(y=0, color='#A9A9A9')
plt.grid(True)
plt.plot(B[0],B[1],'-yo',lw=2)  # 绘制输入图形
plt.plot(Y[0],Y[1],'-go',lw=2)  # 绘制输入图形
plt.show()

具体用法,请往下看。


图形平移

  • 竖直平移的变换矩阵是:A=[100−1]A = \begin{bmatrix} 1 &0 \\ 0& -1 \end{bmatrix}A=[10​0−1​],水平平移的变换矩阵是:A=[−1001]A = \begin{bmatrix} -1 &0 \\ 0& 1 \end{bmatrix}A=[−10​01​]。
# 1.定义变换矩阵A,用于图形平移(竖直平移)
A = np.array([[1,0],[0,-1]])


图形剪切

  • 水平剪切的变换矩阵是:A=[1k01]A = \begin{bmatrix} 1 &k \\ 0& 1 \end{bmatrix}A=[10​k1​],竖直剪切的变换矩阵是:A=[10k1]A = \begin{bmatrix} 1 &0 \\ k& 1 \end{bmatrix}A=[1k​01​], 会影响方向。
# 1.定义变换矩阵A,用于图形剪切
k = -0.8
A = np.array([[1,0],[k,1]])


图形放大

水平放大的矩阵是:A=[1002]A = \begin{bmatrix} 1 &0 \\ 0& 2 \end{bmatrix}A=[10​02​],竖直放大的变换矩阵是:A=[2001]A = \begin{bmatrix} 2 &0 \\ 0& 1 \end{bmatrix}A=[20​01​]

# 1.定义变换矩阵A,图形整体放大 1 倍
A = np.array([[2,0],[0,2]])


图形缩小同理。


图形旋转

  • 逆时针旋转的变换矩阵是:A=[cosθsinθ−sinθcosθ](θ<0)A = \begin{bmatrix} cos\theta &sin\theta \\ -sin\theta & cos\theta \end{bmatrix}(\theta <0)A=[cosθ−sinθ​sinθcosθ​](θ<0),顺时针旋转的变换矩阵是:A=[cosθsinθ−sinθcosθ](θ>0)A = \begin{bmatrix} cos\theta &sin\theta \\ -sin\theta & cos\theta \end{bmatrix}(\theta >0)A=[cosθ−sinθ​sinθcosθ​](θ>0)。
# 1.定义变换矩阵A,图形旋转
theta = -(3.14/4)
A = np.array([[np.cos(theta),np.sin(theta)],[-np.sin(theta),np.cos(theta)]])


旋转的角度最复杂,我们可能不太清楚这个角度是怎么来的。


矩阵变化的推导

我们推导一下,图形旋转的变化过程。


推导的前置知识:高中的三角函数。

不一定要每一步都弄明白,但要知道我们可以把矩阵看成一种对向量的变换(函数),这个很重要,理解的越深刻越好。

我们看最简单的情况,如下图。


蓝色的向量旋转 θ\thetaθ 度角得到红线 ,如果我们设这个变换的矩阵为 a,b,c,da,b,c,da,b,c,d,则有这样一个式子:

  • 令 A=[abcd]A=\begin{bmatrix} a & b \\ c & d \end{bmatrix}A=[ac​bd​],则有:[abcd]∗[xy]=[x′y′]\begin{bmatrix} a &b \\ c & d \end{bmatrix}*\begin{bmatrix} x\\y \end{bmatrix}=\begin{bmatrix} x^{'}\\ y^{'} \end{bmatrix}[ac​bd​]∗[xy​]=[x′y′​]。

因为是经过旋转得到的,因此新的坐标和原来的坐标一定是有联系的,这个联系就是角度 θ,α\theta ,~\alphaθ, α。

推导过程:

  • 设向量(蓝色)的模为 LLL,由三角关系式得到:cos(α)=xLcos(\alpha )=\frac{x}{L}cos(α)=Lx​,即 L=xcos(α)L=\frac{x}{cos(\alpha )}L=cos(α)x​;sin(α)=yLsin(\alpha )=\frac{y}{L}sin(α)=Ly​,即 L=ysin(α)L = \frac{y}{sin(\alpha )}L=sin(α)y​。
  • 向量(红色)由于仅有旋转没有伸缩,因此红色向量的模依然是 LLL:cos(α−θ)=x′Lcos(\alpha -\theta )=\frac{x^{'}}{L}cos(α−θ)=Lx′​,即 L=x′cos(a−θ)L=\frac{x^{'}}{cos(a-\theta )}L=cos(a−θ)x′​;sin(a−θ)=y′Lsin(a-\theta )=\frac{y^{'}}{L}sin(a−θ)=Ly′​,即 L=y′sin(α−θ)L=\frac{y^{'}}{sin(\alpha -\theta )}L=sin(α−θ)y′​
  • x′=cos(α−θ)cosαxx^{'}=\frac{cos(\alpha -\theta )}{cos\alpha }xx′=cosαcos(α−θ)​x, y′=sin(α−θ)sinαyy^{'}=\frac{sin(\alpha -\theta )}{sin\alpha }yy′=sinαsin(α−θ)​y
  • [abcd]∗[xy]=[cos(α−θ)cosαxsin(α−θ)sinαy]\begin{bmatrix} a & b \\ c & d \end{bmatrix}*\begin{bmatrix} x\\ y \end{bmatrix}=\begin{bmatrix} \frac{cos(\alpha -\theta )}{cos\alpha }x\\ \frac{sin(\alpha -\theta )}{sin\alpha }y \end{bmatrix}[ac​bd​]∗[xy​]=[cosαcos(α−θ)​xsinαsin(α−θ)​y​],比对系数确定 a,b,c,da,~b,~c,~da, b, c, d
  • ax+by=cos(α−θ)cosαx=cosα∗cosθ+sinαsinθcosαx=cosθ∗x+tanα∗sinθ∗x=cosθ∗x+yxsinθ∗x=cosθ∗x+sinθ∗yax+by=\frac{cos(\alpha -\theta )}{cos\alpha }x=\frac{cos\alpha* cos\theta +sin\alpha sin\theta }{cos\alpha }x=cos\theta *x+tan\alpha *sin\theta *x=cos\theta *x+\frac{y}{x}sin\theta *x=cos\theta *x+sin\theta *yax+by=cosαcos(α−θ)​x=cosαcosα∗cosθ+sinαsinθ​x=cosθ∗x+tanα∗sinθ∗x=cosθ∗x+xy​sinθ∗x=cosθ∗x+sinθ∗y,一步步化简得到最后的。
  • cx+dy=sin(a−θ)sinαy=sinαcosθ+cosαsinθsinαy=−sinθ∗x+cosθ∗ycx+dy=\frac{sin(a-\theta )}{sin\alpha }y=\frac{sin\alpha~ cos\theta +cos\alpha sin\theta }{sin\alpha }y=-sin\theta *x+cos\theta *ycx+dy=sinαsin(a−θ)​y=sinαsinα cosθ+cosαsinθ​y=−sinθ∗x+cosθ∗y
  • [cosθsinθ−sinθcosθ]\begin{bmatrix} cos\theta &sin\theta \\ -sin\theta & cos\theta \end{bmatrix}[cosθ−sinθ​sinθcosθ​],这个结果就是变换 矩阵AAA 呀!!!


图形旋转角度就是这么推导过来的,在《数学女孩 4》的矩阵 — 线性变换一节,里面就有其TA图形变换的推导过程。


总结

第一部分,介绍了矩阵、来源、运算,工程应用是矩阵卷积,趁热打铁去搞定卷积网络吧。

第二部分,介绍了看待矩阵的四种视角,我们选的是变换,工程应用是图形图像处理。

归根结底,是函数表示变换。任意函数都是从输入到输出的变换。矩阵可以看做是向量的函数:)

这种变换,还可以扩展到三维空间,比如说电视成像、转播。

电视机成像的原理大概是,通过一把电子枪,把电子打到屏幕上:

不过对于这样的彩色图片一把电子枪是不够的:


可以把这幅图片以 红色、绿色、蓝色 为基,分为三张图片:


用三把电子枪分别把 红色RRR、绿色GGG、蓝色BBB 的电子打到屏幕上,来呈现出彩色的画面:

电视转播则不同,信号不是以 红色RRR、绿色GGG、蓝色BBB 的电子传过来的,而是另一个颜色空间的表示方法。

不是靠三原色 RGBRGBRGB 传递,而是通过 YCbCrYC_bC_rYCb​Cr​、YPbPrYP_bP_rYPb​Pr​ 传递。

  • YCbCrYC_bC_rYCb​Cr​,采用亮度-色差来描述颜色的颜色空间
  • YPbPrYP_bP_rYPb​Pr​ ,模拟视频中的明度、彩度、同步脉冲分解开来各自传送的端子。

彩色电视机背后有 YPbPrYP_bP_rYPb​Pr​、YCbCrYC_bC_rYCb​Cr​ 接口,完整地插入 YPbPrYP_bP_rYPb​Pr​ 、YCbCrYC_bC_rYCb​Cr​ 信号就可以看到彩色图片了:

  • 若是接入 YYY,可产生黑白图像;
  • 若是再接入 Pb/CbP_b/C_bPb​/Cb​ 、Pr/CrP_r/C_rPr​/Cr​ ,就会产生彩色图像。

将 RGBRGBRGB 转换为 YPrPbYP_rP_bYPr​Pb​、YCbCrYC_bC_rYCb​Cr​,这个过程也是矩阵函数的一个实例:

加油:)

矩阵实验:图形图像处理相关推荐

  1. OpenCV-Python图形图像处理:split通道拆分和数组矩阵访问通道

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在OpenCV中,图像装载后以矩阵保存,对于灰度图矩阵为二维矩阵,对于彩色图像则 ...

  2. OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.引言 为了支持进行图像处理测试,老猿将一些经常需要使用到的功能做成了函数放到了公用模块 ...

  3. OpenCV-Python图形图像处理专栏文章目录

    ☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 注: 1.部分文章前面标星号表示文章为付费专栏文章 2.本专栏的伴生付费专栏<htt ...

  4. MATLAB图形图像处理——图像灰度变换

    MATLAB图形图像处理--图像灰度变换 一.MATLAB入门知识 1.什么是MATLAB 2.MATLAB处理图像 图像数据 数据类型 位深 函数 imread imwrite 二.图像灰度变换基础 ...

  5. OpenCV-Python图形图像处理:利用TopHat顶帽获取背景色中的噪点

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.顶帽简介 顶帽(Top Hat),又称"礼帽"运算,其结果图像为原 ...

  6. 图形图像处理 - 手写 QQ 说说图片处理效果

    OpenCv 的基础学习目前先告一段落了,后面我们要开始手写一些常用的效果,且都是基于 Android 平台的.希望我们有一定的 C++ 和 JNI 基础,如果我们对这块知识有所欠缺,大家不妨看看这个 ...

  7. php图形图像处理技术

    图形图像处理技术,gd库的强大支持,PHP的图像可以是PHP的强项,PHP图形化类库,jpgraph是一款非常好用的强大的图形处理工具. 在PHP中加载GD库 gd官方网址下载: http://www ...

  8. 图形图像处理-之-高质量的快速的图像缩放 中篇 二次线性插值和三次卷积插值

    from:http://blog.csdn.net/housisong/article/details/1452249 图形图像处理-之-高质量的快速的图像缩放 中篇 二次线性插值和三次卷积插值    ...

  9. 3D图形图像处理软件HOOPS介绍及下载

    HOOPS 3D Application Framework(以下简称HOOPS)是建立在OpenGL.Direct3D等图形编程接口之上的更高级别的应用程序框架.不仅为您提供强大的图形功能,还内嵌了 ...

最新文章

  1. 关于组织参加2020年全国大学生智能汽车竞赛山东赛区比赛的通知
  2. MBB IN CONSULTING
  3. leetcode9 回文数
  4. 在java中5 % 3_Java基础5
  5. IOS 内存优化和调试技巧
  6. pandas read_sql
  7. mysql 多级主从_mysql主从复制-二级主从
  8. Skyline软件二次开发初级——11如何在WEB页面中的三维地图上加载和保存工程文件...
  9. 如何用photoshop快速换脸
  10. 电驴维持友情链接地址、更新服务器列表
  11. 「免费 | 重磅」9月19日首届智能决策论坛即将开幕!(附带10+位作者演讲主题及摘要)「中国科学院自动化研究所」...
  12. 新手怎么做一个小程序?
  13. 取消挂载是提示:device is busy
  14. 深度解析大数据在公安领域的应用
  15. Win11找不到DNS地址怎么办?Win11找不到DNS无法访问网页解决方法
  16. RZ,NRZ,NRZI
  17. 如何使用overleafLaTeX
  18. Python ❀ 函数
  19. unity虚拟仿真PC端需要掌握的技术
  20. python打分函数_自定义评分函数RandomForestRegress

热门文章

  1. 关于如何通过信息系统监理师的自我心得
  2. 也门亚丁一炼油厂爆炸起火造成数人受伤
  3. SLM328美格4G模组SDK开发笔记
  4. 医学影像数据格式转换(.mha转.jpg)
  5. SEO分类:白帽SEO-黑帽SEO-灰帽SEO
  6. Windows 8系统中LOL登陆错误出现的服务器未响应怎么处理?
  7. 天津理工上机c语言报告5,天津理工大学C语言上机报告题目加答案.doc
  8. Excel-用OFFSET和COUNTA实现动态增加下拉列表
  9. win10安装elasticSearch8.1.2,报错解决方案
  10. Uipath Excel-读取操作(Read Row)