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

4.2 图像平移

图像平移就是将图像中所有的点按照指定的平移量水平或者垂直移动。

4.2.1 图像平移的变换公式

设(x0,y0)为原图像上的一点,图像水平平移量为Tx,垂直平移量为Ty,如图4.2所示。

图4.2 平移变换坐标图

则平移之后的点坐标(x1,y1)变为:

这样,平移后的目标图像中的每一点都可以在原图像中找到对应的点。例如:对于新图中的(i, j)像素,代入上面的方程组,可以求出对应原图中的像素(i-Tx, j-Ty)。而此时如果Tx大于iTy大于j,则点(i-Tx, j-Ty)超出了原图的范围,可以直接将它的像素值统一设置为0或者255。

对于原图中被移出图像显示区域的点通常也有两种处理方法,可以直接丢弃,也可以通过适当增加目标图像尺寸(将新生成的图像宽度增加Tx,高度增加Ty)的方法使得新图像中能够包含这些点。在稍后给出的程序实现中,本书采用了第一种处理方法。

4.2.2 图像平移的实现

1.MATLAB编程实现

MATLAB没有直接用于图像平移的函数,这里给出了一个基于灰度形态学的图像平移实现,供有兴趣的读者参考,没有接触过灰度形态学的朋友可以在学习过第11章之后再回过头来考虑这个算法。

      % 图像平移

      A=imread('girl.bmp'); %读入图像

      %strel用来创建形态学结构元素
      %translate(SE, [y x])在原结构元素SE上进行y和x方向的偏移
      %参数[80 50]可以修改,修改后平移距离对应改变
      se= translate(strel(1), [80 50]);

      %imdilate  形态学膨胀
      B = imdilate(A, se);
      figure;
      subplot(1,2,1), subimage(A);
      title(’原图像’);
      subplot(1,2,2), subimage(B);
      title(’图像平移’);

上述算法的平移效果如图4.3所示,注意到对于映射在原图像之外的点算法直接采用黑色(0)填充,并丢弃了变换后目标图像中被移出图像显示区域的像素。

图4.3 平移变换效果

2.Visual C++实现

利用Visual C++实现图像平移的代码如下。

      /*******************
      void CImgProcess::ImMove(CImgProcess * pTo, int x, int y)
       功能:     平移图像
       注:       图像范围不变
       参数:    CImgProcess * pTo:处理后得到的图像的CImgProcess指针
                int x:水平右移距离
                int y:垂直下移距离
       返回值: 无
      *******************/
      void CImgProcess::ImMove(CImgProcess* pTo, int x, int y)
      {
            int nHeight = pTo->GetHeight();
            int nWidth = pTo->GetWidthPixel();

            int i, j;

            if(x>nWidth || y>nHeight)
            {
                MessageBox(NULL, "超过图片大小", "错误", MB_OK|MB_ICONERROR);
                return;
            }

            for(i=0; i<nWidth; i++)
            {
                for(j=0; j<nHeight; j++)
                {
                      if(i-x>0 && i-x<nWidth && j-y>0 &&j-y<nHeight)
                          pTo->SetPixel(i, j, GetPixel(i-x, j-y));
                      else
                          pTo->SetPixel(i, j, RGB(255, 255, 255));
                  }//for j
            }//for i

      }

ImMove()函数的调用方式如下所示。

      // 调用ImMove()函数实现图像平移
      imgInput.ImMove(&imgOutput, lXOffset, lYOffset);

      // 将结果返回给文档类
      pDoc->m_Image = imgOutput;

读者可以通过光盘中示例程序DIPDemo中的菜单命令“几何变换→图像平移”来观察处理效果。