机器视觉学习笔记(六)-- 几何变换

        在许多应用中,并不能保证被测物在图像中总是处于同样的位置和方向。所以,检测算法必须能过应对这种位置的变换。因此,首先要解决的问题就是检测出被测物的位置和方向,即被测物的位姿,我们假设此时被测物的位姿已知。此时,调整物体到检测所需位姿的最简单的方法就是对ROI的位姿进行适当的调整。

        例如,如果我们知道一个物体被旋转了45°,那么在进行对物体的检测前,我们只需将ROI也旋转45°即可。但在一些情况下,图像必须先被变换(对准)得到一个标准位姿,然后进行检测。


3.3.1  仿射变换

        如果在机械装置上物体的位置和旋转角度不能保持恒定,我们必须对物体进行平移和旋转角度修正。有时由于摄像机和物体之间的距离发生了明显变化。这些情况下使用的变换称为仿射变换,可以用以下等式描述:

\begin{pmatrix} \tilde{r} \\ \tilde{c} \end{pmatrix} = \begin{pmatrix} a_{11} & a_{12}\\ a_{21} & a_{22} \end{pmatrix}\begin{pmatrix} r\\ c \end{pmatrix}+\begin{pmatrix} t_{r}\\ t_{c} \end{pmatrix}

        上式中,一个仿射变换包括一个由 2 x 2 的矩阵给定的线性部分和一个平移部分。但由于总是需要将平移部分单独列出,所以此种表述有些繁琐。为解决这个问题,在原坐标的基础上引入第三个数值为 1 的坐标,这种表示方法能让我们用简单的矩阵乘法来表示仿射变换:

\begin{pmatrix} \tilde{r}\\ \tilde{c}\\ 1 \end{pmatrix} = \begin{pmatrix} a_{11} & a_{12} & a_{13}\\ a_{21} & a_{22} & a_{23}\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} r\\ c\\ 1 \end{pmatrix}

        此种附加了多余的第三个坐标的表示法叫做齐次坐标:

        前三个基本变换无需更多解释。倾斜是仅让一个轴旋转,此处是让纵轴旋转一个角度,这在OCR矫正倾斜字符时非常有用。

3.3.2  投影变换

        仿射变换几乎能校正物体所有可能发生的与位姿相关的变化,但不能应付所有情况。如果被讨论的物体在三维空间发生了旋转,他就经历了一个很平常的投影变换,由于可能出现阴影或遮挡,所以投影变换是很难被修正的。但如果物体是平面的,我们能通过二维投影变换对此物体的三维变换进行模型化,这就是一个专用的二维投影变换。投影变换可由下式给出:

\begin{pmatrix} \tilde{r}\\ \tilde{c}\\ \tilde{w} \end{pmatrix}=\begin{pmatrix} h_{11} & h_{12} & h_{13}\\ h_{21} & h_{22} & h_{23}\\ h_{31} & h_{32} & h_{33} \end{pmatrix}\begin{pmatrix} r\\ c\\ w \end{pmatrix}

        透视变换的公式与仿射变换公式有相似之处。仅有的几个区别就是投影变换使用一个完整的3 x 3 矩阵来描述的,并且将仿射变换里第三个坐标从 1 变为一个变量 w。实际上这个表示法是真正的齐次坐标表示法,它也能被用来描述仿射变换,因为仿射变换是特殊的投影变换。由于有了第三个坐标,我们如何能够得到一个变换后的二维坐标,即如何计算对应的非齐次点,并不是显而易见的。

        首先,必须注明在齐次坐标中的全部点只能被定义为一个比例因子。相应地,由矩阵H给定的投影变换也只能定义为一个比例因子,因此只能有8个独立参数。为从齐次表达式中计算出它对应的非齐次二维点,我们必须用齐次向量除以w,这要求w不等于0。这样的点被称为有限点。反之,w等于0的点被称为无限点,这是因为它们位于某一方向上无限远处。

        既然一个投影变换有8个独立参数,那么投影变换可以通过四个相应的点被唯一地确定。这是在机器视觉应用中通常确定投影变换的方法。我们从图像中提取四个点,典型情况下是一个矩形,然后矫正图像使这四个被提取出来的点能变换到矩形的四个角上,即变换到它们对应的点上。

3.3.3  图像变换

        在已经学习了如何用仿射和投影变换来实现坐标变换后,我们能够考虑如何对图像进行变换。最简单的一个想法或许是在输入图像上遍历全部像素,计算它们变换后的坐标,然后设置输出图像上这些坐标处的灰度值。

        不幸的是,这个简单的策略并不能成功,我们可以通过对一幅图像放大2倍时发生的事情来说明:输出图像中只有四分之一的像素可以被设置。变换一幅图像的正确方法是在输出图像内遍历所有像素并计算其在输入图像中相对应的点的位置。这是保证能够对输出图像中所有相关像素进行设定的最简单方法。幸运的是,在原始图像中计算对应点的位置是容易的:我们仅需要先对表示仿射变换或投影变换的矩阵求逆,然后使用此矩阵进行仿射或者投影变换即可。

        当图像坐标被从输出图像变换到输入图像时,通常情况下不是输出图像中的所有像素都能被变换回位于输入图像内的坐标上。我们能通过为输出图像计算一个合适的ROI来解决这一问题。而且,在输入图像中的结果坐标通常不是整数坐标。在图3.16中我们给出一个这样的例子,在此例中对输入图像进行了一个包括平移,旋转和缩放的仿射变换。所以,输出图像内的灰度值必须是由插值得到的。

        插值方法存在多种。图3.17(a)显示的是输出图像中的一个像素已被变换回输入图像中,注意转换后这个像素的中心点是位于邻近的四个像素中心点之间,是一个非整数的位置。

        最简单快速的插值法是先对转换后像素中心的非整数坐标进行取整处理,以找到与此坐标相邻的四个像素点的中心位置中最近的一个,然后将输入图像里的这个最邻近位置的像素灰度值视为输出图像内相应像素点的灰度值,如图3.17(b)所示。这种插值方法被称为最近邻域插值法,此插值算法的效果见图3.18。图3.18(a)中显示的是一张纸币上的序列号,序列号中的字符不是水平的。图3.18(c)和图3.18(d)显示的是采用最近邻域插值法将此序列号旋转为水平后的结果。

        由于灰度值是从最近的像素中心上取得的,所以字符的边缘出现了锯齿状外观,这个结果不是我们想得到的。最近邻域插值法的结果中会出现锯齿状外观的根本原因是我们把图像看成了一个分段常值函数:落在整数坐标 \pm 0.5 的矩形区域内的每个坐标都被赋值为同一个灰度值。这就导致了结果的不连续性,而这种结果的不连续性造成了锯齿状外观。这在对图像进行一倍以上的放大处理时尤其明显。

        为得到更好的插值算法,我们应在处理中使用更多的信息而不仅仅是使用最近像素的灰度值。从图3.17(a)中可以看出,变换后像素的中心位于一个正方形中,此正方形的四个顶点就是与此像素相邻的四个像素的中心点。所以,我们可以使用适当的权重配合这四个灰度值进行插值运算。

        这样做的方法之一就是使用双线性插值法,如图3.17(c)所示。首先,我们分别计算转换后的坐标到四个相邻像素中心点的垂直方向和水平方向的距离。注意这些计算处的距离值在0到1之间。然后,根据距离值计算出不同灰度值所占的权重后得到双线性插值的结果:

\tilde{g} = b(ag_{11}+(1-a)g_{01})+(1-b)(ag_{10}+(1-a)g_{00})

        图3.18(e)和(f)显示的是对3.18(a)进行旋转时所使用双线性插值处理后的结果。注意现在字符边缘的外观变得非常平滑了。这个更加的结果需要更长的计算时间(通常是原计算时间的5倍以上)。

        在双线性插值的方案中,我们从最近的四个像素中心点来计算插值。但如果对图像进行缩小,在输出图像中相邻的像素不一定在输入图像中还相邻。设想一幅宽度为一个像素、线间距为三个像素的垂线的大尺寸图像被缩小到原来的1/4,使用最近邻域插值法:我们得到的结果图上会使宽度为一个像素,线间距为四个像素的垂线。这当然不是我们希望得到的结果。使用双线性插值法,我们也会得到类似的意外结果。如果我们缩小一幅图像时,从本质上讲我们在对其进行二次采样。因此,我们可能碰到混淆现象。

        为了改善图像变换的结果,图像必须在缩小处理前进行平滑处理,比如,可使用均值滤波器或高斯滤波器进行平滑处理。另一种解决方法是讲平滑处理整合到灰度值插值处理中。图3.19(e)显示了在图像变换中结合了一个均值滤波器进行处理后的结果。

        在上例中,我们已经看到了仿射变换在矫正文本时的有效性。但有时这样的矫正仅使用一个仿射变换还是不够的。图3.20(a)和(b)给出了两幅汽车牌照图像。由于本例中摄像机相对于汽车的位置不可控,所以车牌的图像存在一些透视畸变。图3.20(c)和(d)是针对原图中的车牌应用投影变换并矫正后的结果。所以,图3.20(c)和(d)与我们从汽车正前方观看车牌时所看到的结果相似。很明显,此时更容易分割和读取车牌上的字符了。

3.3.4  极坐标变换

        极坐标变换通常被用来矫正图像中的圆形物体或被包含在圆环中的物体。图3.21(a)是一个极坐标变换的例子。此例中我们可以观察到CD盘在靠近圆心的部分有一个环形条码和部分文本。为了读取此条码,一个方案就是对图像中包含条码的部分进行矫正。极坐标变换就能被用来实现此矫正,它将图像坐标变换为极坐标(d,\phi ),即相对于变换中心的距离d和向量角度\phi。变换中心由(m_{r},m_{c})给出,那么,某点(r,c)的极坐标是:

\begin{matrix} d=\sqrt{(r-m_{r})^2+(c-m_{c})^2}\\ \phi = arctan(-\frac{r-m_{r}}{c-m_{c}}) \end{matrix}

        基于分数上下两项的符号,在计算反正切函数arctan时,必须使用正确的象限。注意将某个点变换到极坐标是相当耗时的运算,因为要进行开平方和反正切计算。幸运的是,与仿射变换和投影变换类似,进行变换处理时可以使用极坐标变换的逆变换,即:

\begin{matrix} r = m_{r} - dsin\phi\\ c = m_{c} + dcos\phi \end{matrix}

        这里,由于\phi的值是数量有限的离散值,所以它们的正弦和余弦值能被列入表格,故而只需要计算一次。所以一幅图像的极坐标变换能被高效率地计算出来。注意,通过限定d\phi的取值范围,我们能对圆的任意扇形区域进行变换。图3.21(b)是对图3.21(a)中包含条码的圆环进行变换的结果。注意极坐标变换后的条码又直又平,所以很容易读取。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值