数字图像处理篇(11)几何变换(上)

文章介绍了矩阵在图像变换中的应用,包括矩阵定义、旋转和平移的矩阵表示,以及仿射变换的原理,如缩放、形变和翻转。通过矩阵运算,解释了如何使用矩阵来改变图像的空间坐标,从而实现各种视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、引言

二、矩阵与变换

1、矩阵    

①定义

②矩阵乘法

2、简单的自由变换

①旋转

②平移

③刚体变换(旋转+平移)

3、仿射变换

 ①缩放

②形变

 ③翻转


一、引言

        相信大家一直都有一个疑问?咦?博主你不是研究量子计算的吗,怎么数字图像处理也研究了这么多?我来回答一大家的问题:因为博主特别喜欢摄影,而摄影又需要学会一些修图软件,才能让照片的光感、韵味更强。

        在这里给读者们欣赏几张小编最近拍的照片,读者们会夸就多夸一点(老脸一红)。

         是不是觉得这几张图片特别好看,特别唯美?(小编脸皮厚,总喜欢时不时地夸一下自己,大家习惯就好)。这些照片都是经过处理过的,我们大体将图片的处理分为两类:一类是改变图像的像素值,比如说调亮、调暗、增强饱和度等等,这个小编在之前的博客中提到过。另一类是改变图像的空间坐标,比如说平移、旋转、伸缩等等。这类变换是我们今天研究的重点,其具体类别可以看看下面这张图:

        话不多说,跟随我的脚步,开始学习吧!

二、矩阵与变换

        学好数理化,走遍天下都不怕,计算机是离不开数学知识辅佐的。不论是量子计算也好,量子计算也罢,这两门学科所需要的最重要的数学知识,就是线性代数知识。毕竟图片的本质,就是一个2×2的矩阵,矩阵中的每个元素都是由RGB通道组成的三元组,代表着这一个像素点的颜色信息。不过本篇文章是用矩阵解决位置坐标的问题,也就是将矩阵的自由变换的过程抽象为一个矩阵函数,再进行运算。

1、矩阵    

①定义

        矩阵的定义: 由 m×n 个数 : \alpha _{ij}(i=1,2,…,m;j=1,2,…,n)排成的 m 行 n 列的数表(横排称为行,竖排称为列),我们称它为 m 行 n 列矩阵,简称 m×n 矩阵,为表示它是一个整体,总是加一个括弧,并用大写黑体字母表示它,记作

        这 m×n 个数称为矩阵 A 的元素,简称为元,数\alpha _{ij}位于矩阵 A 的第 i 行第 j 列,称为矩阵 A 的(i,j)元。m×n 矩阵 A 也记作 A_{m\times n}

        元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵,复矩阵在量子计算中经常能用到,主对角线为1其他元素均为0的矩阵为单位阵。

②矩阵乘法

        矩阵的其他性质可能在本篇文章运用不到,但是矩阵的乘法确实理解本篇文章的重中之重。​    矩阵乘法中第一个矩阵的列数要等于第二个矩阵的行数,也就是说一个m×n的的矩阵A,和一个n×p的B矩阵才能相乘,并且A\timesB将得到一个m×p的矩阵C 。

        其中C中的每一项如下(A的第i行分别和B的第j列相乘后再相加):

C_{ij}=\sum_{k=1}^{p}A_{ik}\cdot B_{kj}
 

        矩阵乘法有结合律,但是矩阵乘法不满足交换律。也就是说AB≠BA,这一点学习过线性代数的读者们应该深有体会,不过刚学习线性代数的小伙伴们容易在这里犯错。
 

2、简单的自由变换

①旋转

        我们假设,这张图片的任意一点的矩阵坐标为(x,y),经过旋转后的矩阵坐标为(x{}'{y}')如右图所示:

        已知,设(x,y)与原点的连线与x轴成\alpha角,并且图像旋转了θ角,那么有{x}'=\sqrt{x^{2}+y^{2}}\cdot cos(\theta+\alpha ){y}'=\sqrt{x^{2}+y^{2}}\cdot sin(\theta+\alpha ),这么解肯定能解出来,但是请记得我们今天的主旨:将函数装换为矩阵形式。很多读者觉得,这么复杂肯定不好化简为矩阵形式,于是望而却步了。

        那怎么办呢?别急,老话说的好,不要在一棵树上吊死,除非你的脖子足够硬,数学能力足够强。然而,小编就属于脖子硬的那一类。为了简便,我们令\rho =\sqrt{x^{2}+y^{2}},其几何意义就是坐标离旋转中心的距离。那么{x}'=\rho \cdot cos(\theta+\alpha ),拆开后有{x}'=\rho \cdot (cos\theta cos\alpha -sin\theta sin\alpha),{y}'=\rho \cdot (sin\theta cos\alpha +cos\theta sin\alpha ),这个时候应该就有读者开始恍然大悟了:原来这么简单!因为\rho \cdot cos\alpha =x\rho \cdot sin\alpha =y,带进去就完事了!

        所以最终我们化简为:{x}'=xcos\theta -ysin\theta{y}'=xsin\theta +ycos\theta

        矩阵形式为:({x}',{y}')=(x,y)\cdot RR=\begin{pmatrix} cos\theta & sin\theta \\ -sin\theta & cos\theta \end{pmatrix}

②平移

        还是熟悉的配方,还是熟悉的味道,我们依然假定原图片的任意一点坐标为(x,y),经过平移后的矩阵坐标为(x{}'{y}')。已知,图片沿中心平移向量为T=(t_{1},t_{2}),即向右平移t_{1}个单位,向上平移t_{2}个单位。

         那么很明显{x}'=x+t_{1}{y}'=y+t_{2}。看似很简单,实则如果你想把它换成矩阵的形式,满足({x}',{y}')=(x,y)\cdot R,那么对你把数字进行抽象化的能力有一定的要求。你会发现,怎么样都不能满足上述式子。并且发现,原式带有加法,且还含有x,如何避免x、y与t互不相乘呢?

        所以我们选择了扩大向量的维度:({x}',{y}',1)=(x,y,1)\cdot RR=\begin{pmatrix} 1 & 0 & 0\\ 0& 1&0 \\ t_{1} &t_{2} & 1 \end{pmatrix},问题这不就很巧妙的解决了吗?

③刚体变换(旋转+平移)

        

       小编既然都已经写上了旋转+平移,那么肯定有聪明的小伙伴们能想得到,这个函数的矩阵,不就是旋转的矩阵乘上平移的矩阵吗?而且先旋转再平移与先平移再旋转的效果一模一样,也不用考虑哪个矩阵在前面,哪个矩阵在后面了。

        但是又考虑到,旋转的矩阵是一个2×2的矩阵,平移的矩阵是一个3×3的矩阵,所以,我们要对旋转的矩阵进行改造。对旋转:

({x}',{y}',1)=(x,y,1)\cdot R_{1},R_{1}=\begin{pmatrix} cos\theta & sin\theta &0 \\ -sin\theta & cos\theta &0\\0 &0 &1\end{pmatrix}

 对平移:

({x}',{y}',1)=(x,y,1)\cdot R_{2}R_{2}=\begin{pmatrix} 1 & 0 & 0\\ 0& 1&0 \\ t_{1} &t_{2} & 1 \end{pmatrix}

R1与R2相乘得到矩阵R=R_{1}\cdot R_{2}=\begin{pmatrix} cos\theta & sin\theta &0 \\ -sin\theta & cos\theta &0\\t_{1} &t_{2} &1\end{pmatrix}

3、仿射变换

        相比刚体变换(旋转和平移),仿射变换除了改变目标位置,还改变目标的形状,但是会保持物体的“平直性(如图形中平行的两条线变换后依然平行)”。其原因是矩阵针对的是图像的任意一点,具有普遍性。例如下图:

        我们又可以把这种变换理解为形变+平移,我们先假设产生形变的矩阵为A_{2\times 2},且满足({x}',{y}')=(x,y)\cdot A_{2\times 2}。那么最终的矩阵还是又形变矩阵(调整为3×3的)与平移矩阵相乘,我们能得到一个模板:

({x}',{y}',1)=(x,y,1)\cdot \begin{pmatrix} A_{2\times 2} &0^{T} \\ T_{1\times 2} & 1 \end{pmatrix}

        接下来,我们看几个仿射变换的例子,大家能够分析出每一个矩阵代表的含义就行了。

 ①缩放

        首先通过对矩阵的观察发现,这个矩阵并没有让图像产生平移。我们用原始坐标乘上该矩阵发现,{x}'=Wx{y}'=Hy,也就是水平缩放了W倍,竖直缩放了H倍。

②形变

        以左边这个矩阵为例,相乘后不难发现 {x}'=x{y}'=y+xtan\varphi,我们得去寻找这个角度的几何意义,才能理解形变后是怎样的。这里就不卖关子啦,感兴趣的读者们可以自行验证一下,是不是形变成下面这样:

 ③翻转

 

         可能心算特别强的小伙伴们,看一眼就猜到啦,第一个是沿原点翻转,第二个是沿y轴翻转,第三个是沿x轴翻转。大家仍然可以自行验证一下。

         在文章的最后,我需要特殊声明一下:如果有读者发现我这篇文章的很多结论与其他博主写的不一样,也特别正常。因为我用的是行向量表示图像的任意一点坐标,而大多数人会选择用列坐标来表示,即\begin{pmatrix} x\\ y\\ 1 \end{pmatrix}。而使用行向量与列向量,本身就会产生不一样的结果。小编查阅的资料大多数都是用的列向量,所以叛逆的小编,选择了使用行向量,这样至少证明,这些结论是我自己证明的,而不是简简单单的搬运他人的成果。

        好啦,感谢大家看到这里。如果本篇文章对大家有所帮助,希望大家能给我一个免费的赞与收藏(哪怕是在收藏夹里吃灰也好)。阿里嘎多!!

        

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机鬼才~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值