目录
一、引言
相信大家一直都有一个疑问?咦?博主你不是研究量子计算的吗,怎么数字图像处理也研究了这么多?我来回答一大家的问题:因为博主特别喜欢摄影,而摄影又需要学会一些修图软件,才能让照片的光感、韵味更强。
在这里给读者们欣赏几张小编最近拍的照片,读者们会夸就多夸一点(老脸一红)。
是不是觉得这几张图片特别好看,特别唯美?(小编脸皮厚,总喜欢时不时地夸一下自己,大家习惯就好)。这些照片都是经过处理过的,我们大体将图片的处理分为两类:一类是改变图像的像素值,比如说调亮、调暗、增强饱和度等等,这个小编在之前的博客中提到过。另一类是改变图像的空间坐标,比如说平移、旋转、伸缩等等。这类变换是我们今天研究的重点,其具体类别可以看看下面这张图:
话不多说,跟随我的脚步,开始学习吧!
二、矩阵与变换
学好数理化,走遍天下都不怕,计算机是离不开数学知识辅佐的。不论是量子计算也好,量子计算也罢,这两门学科所需要的最重要的数学知识,就是线性代数知识。毕竟图片的本质,就是一个2×2的矩阵,矩阵中的每个元素都是由RGB通道组成的三元组,代表着这一个像素点的颜色信息。不过本篇文章是用矩阵解决位置坐标的问题,也就是将矩阵的自由变换的过程抽象为一个矩阵函数,再进行运算。
1、矩阵
①定义
矩阵的定义: 由 m×n 个数 : (i=1,2,…,m;j=1,2,…,n)排成的 m 行 n 列的数表(横排称为行,竖排称为列),我们称它为 m 行 n 列矩阵,简称 m×n 矩阵,为表示它是一个整体,总是加一个括弧,并用大写黑体字母表示它,记作
这 m×n 个数称为矩阵 A 的元素,简称为元,数位于矩阵 A 的第 i 行第 j 列,称为矩阵 A 的(i,j)元。m×n 矩阵 A 也记作
。
元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵,复矩阵在量子计算中经常能用到,主对角线为1其他元素均为0的矩阵为单位阵。
②矩阵乘法
矩阵的其他性质可能在本篇文章运用不到,但是矩阵的乘法确实理解本篇文章的重中之重。 矩阵乘法中第一个矩阵的列数要等于第二个矩阵的行数,也就是说一个m×n的的矩阵A,和一个n×p的B矩阵才能相乘,并且AB将得到一个m×p的矩阵C 。
其中C中的每一项如下(A的第i行分别和B的第j列相乘后再相加):
矩阵乘法有结合律,但是矩阵乘法不满足交换律。也就是说AB≠BA,这一点学习过线性代数的读者们应该深有体会,不过刚学习线性代数的小伙伴们容易在这里犯错。
2、简单的自由变换
①旋转
我们假设,这张图片的任意一点的矩阵坐标为(x,y),经过旋转后的矩阵坐标为(,
)如右图所示:
已知,设(x,y)与原点的连线与x轴成角,并且图像旋转了θ角,那么有
,
,这么解肯定能解出来,但是请记得我们今天的主旨:将函数装换为矩阵形式。很多读者觉得,这么复杂肯定不好化简为矩阵形式,于是望而却步了。
那怎么办呢?别急,老话说的好,不要在一棵树上吊死,除非你的脖子足够硬,数学能力足够强。然而,小编就属于脖子硬的那一类。为了简便,我们令,其几何意义就是坐标离旋转中心的距离。那么
,拆开后有
,
,这个时候应该就有读者开始恍然大悟了:原来这么简单!因为
,
,带进去就完事了!
所以最终我们化简为:,
。
矩阵形式为:,
②平移
还是熟悉的配方,还是熟悉的味道,我们依然假定原图片的任意一点坐标为(x,y),经过平移后的矩阵坐标为(,
)。已知,图片沿中心平移向量为T=
,即向右平移
个单位,向上平移
个单位。
那么很明显,
。看似很简单,实则如果你想把它换成矩阵的形式,满足
,那么对你把数字进行抽象化的能力有一定的要求。你会发现,怎么样都不能满足上述式子。并且发现,原式带有加法,且还含有x,如何避免x、y与t互不相乘呢?
所以我们选择了扩大向量的维度:,
,问题这不就很巧妙的解决了吗?
③刚体变换(旋转+平移)
小编既然都已经写上了旋转+平移,那么肯定有聪明的小伙伴们能想得到,这个函数的矩阵,不就是旋转的矩阵乘上平移的矩阵吗?而且先旋转再平移与先平移再旋转的效果一模一样,也不用考虑哪个矩阵在前面,哪个矩阵在后面了。
但是又考虑到,旋转的矩阵是一个2×2的矩阵,平移的矩阵是一个3×3的矩阵,所以,我们要对旋转的矩阵进行改造。对旋转:
,
对平移:
,
R1与R2相乘得到矩阵
3、仿射变换
我们又可以把这种变换理解为形变+平移,我们先假设产生形变的矩阵为,且满足
。那么最终的矩阵还是又形变矩阵(调整为3×3的)与平移矩阵相乘,我们能得到一个模板:
接下来,我们看几个仿射变换的例子,大家能够分析出每一个矩阵代表的含义就行了。
①缩放
首先通过对矩阵的观察发现,这个矩阵并没有让图像产生平移。我们用原始坐标乘上该矩阵发现,,
,也就是水平缩放了W倍,竖直缩放了H倍。
②形变
以左边这个矩阵为例,相乘后不难发现 ,
,我们得去寻找这个角度的几何意义,才能理解形变后是怎样的。这里就不卖关子啦,感兴趣的读者们可以自行验证一下,是不是形变成下面这样:
③翻转
可能心算特别强的小伙伴们,看一眼就猜到啦,第一个是沿原点翻转,第二个是沿y轴翻转,第三个是沿x轴翻转。大家仍然可以自行验证一下。
在文章的最后,我需要特殊声明一下:如果有读者发现我这篇文章的很多结论与其他博主写的不一样,也特别正常。因为我用的是行向量表示图像的任意一点坐标,而大多数人会选择用列坐标来表示,即。而使用行向量与列向量,本身就会产生不一样的结果。小编查阅的资料大多数都是用的列向量,所以叛逆的小编,选择了使用行向量,这样至少证明,这些结论是我自己证明的,而不是简简单单的搬运他人的成果。
好啦,感谢大家看到这里。如果本篇文章对大家有所帮助,希望大家能给我一个免费的赞与收藏(哪怕是在收藏夹里吃灰也好)。阿里嘎多!!