数字图像处理与机器视觉:Visual C++与Matlab实现(第2版)
上QQ阅读APP看书,第一时间看更新

4.1 解决几何变换的一般思路

图像几何变换又称为图像空间变换,它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置。学习几何变换的关键就是要确定这种空间映射关系,以及映射过程中的变换参数。

几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排。一个几何变换需要两部分运算:首先是空间变换所需的运算,如平移、旋转和镜像等,需要用它来表示输出图像与输入图像之间的(像素)映射关系;此外,还需要使用灰度插值算法,因为按照这种变换关系进行计算,输出图像的像素可能被映射到输入图像的非整数坐标上。

设原图像f(x0, y0)经过几何变换产生的目标图像为g(x1, y1),则该空间变换(映射)关系可表示为:

其中,s(x0, y0)和t(x0, y0)为由f(x0, y0)到g(x1, y1)的坐标变换函数。例如,当x1=s(x0, y0)=2x0, y1=t(x0, y0)=2y0时,变换后的图像g(x1, y1)只是简单地在xy两个空间方向上将f(x0, y0)的尺寸放大一倍。因此,读者看到只要掌握了有关变换函数s(x0, y0)和t(x0, y0)的情况,就可以遵循下面的步骤实现几何变换。

算法4.1

      根据空间变换的映射关系,确定变换后目标图像的大小(行、列范围); //有些变换可能改变图像大小
      计算逆变换s-1(j1, i1)和t-1(j1, i1);

      逐行扫描目标图像g(x1 , y1),对于g(x1 , y1)中的每一点(j0, i0):
      {
        根据空间变换的映射关系,计算得:
          j0'=s-1(j1, i1); //直接通过映射关系计算得到的横坐标,可能不是整数
        i0'=t-1(j1, i1); //直接通过映射关系计算得到的纵坐标,可能不是整数

        根据选用的插值方法:
        (j0, i0)=interp(j0', i0'); //对于非整数坐标(j0', i0')需要插值

        If  (j0, i0)在图像f之内
            复制对应像素:g(j1 , i1)=f(j0 , i0);
        Else
            g(j1 , i1)=255;
      }

对于几何失真图像的复原(校正)过程正好是上述变换的逆过程。

式(4-3)和式(4-4)表示相应的由g(x1, y1)到f(x0, y0)的逆变换。此时,经过某种几何变换而失真的图像g(x1, y1)是读者要复原的对象,原始图像f(x0, y0)是读者复原的目标。逆变换的代码描述将结合车牌复原的应用在4.9节中给出。

对服务于识别的图像处理而言,作为图像几何归一化的逆变换过程的应用常常更为广泛。当然,在变换中究竟以谁作为原始图像f(x0, y0),以谁作为变换图像g(x1, y1)并不是绝对的,这完全取决于读者在分析特定问题过程中的立场。比如说对于图4.1中的两幅图像,一般的做法是以图4.1(a)为原始图像,图4.1(b)为变换图像。这是因为在图4.1(b)中读者关心的对象(数字和字母)处于一个便于观察的角度(正的)。但我们也完全可以将图4.1(b)视为f(x0, y0),而图4.1(a)视为g(x1, y1)。此时,相应的映射关系st也会发生变化。

图4.1 旋转前后的两幅图像

当图像归一化(参见3.7节)用于消除几何因素(视角、方位等)造成的图像外观变化时,称为(图像)几何归一化,它能够排除对象间几何关系的差别,找出图像中的那些几何不变量,从而得知这些对象原本就是一样的或属于相同的类别。