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

4.5 图像缩放

图像缩放是指图像大小按照指定的比率放大或者缩小,如图4.8所示。

图4.8 缩放变换效果图

4.5.1 图像缩放的变换公式

假设图像x轴方向的缩放比率Sx, y轴方向的缩放比率Sy,相应的变换表达式为:

其逆运算如下:

直接根据缩放公式计算得到的目标图像中,某些映射原坐标可能不是整数,从而找不到对应的像素位置。例如:当Sx=Sy=2时,图像放大2倍,放大图像中的像素(0,1)对应于原图中的像素(0,0.5),这不是整数坐标位置,自然也就无法提取其灰度值。因此操作者必须进行某种近似处理,一种简单的策略是直接将它最邻近的整数坐标位置(0,0)或者(0,1)处的像素灰度值赋给它,这就是所谓的最近邻插值。当然还可以通过4.7节将介绍的其他插值算法来近似。

4.5.2 图像缩放的实现

1.MATLAB编程实现

缩放变换仍然可借助前面几节中使用的imtransform()函数来实现。此外,MATLAB还提供了专门的图像缩放函数imresize(),具体调用形式如下。

      B=imresize(A, Scale, method);

• 参数A为要进行缩放的原始图像。

Scale为统一的缩放比例。

• 可选参数method用于为imresize()函数指定的插值方法,其合法取值同imtransform()函数,但默认为最近邻插值。

输出B为缩放后的图像。

下面给出图像等比例缩放的MATLAB编程实现的代码。

      % 图像缩放

      A = imread('girl.bmp');
      B = imresize(A,1.2, 'nearest');
      %图像扩大1.2倍
      figure, imshow(A); title(’原图像’);
      figure, imshow(B); title(’图像缩放’);

程序运行结果如图4.9所示。

图4.9 缩放变换效果图

如果希望在xy方向上以不同比例进行缩放,可使用如下方式调用imresize()函数。

      B = imresize(A, [mrows ncols], method);

向量参数[mrows ncols]指明了变换后目标图像B的具体行数(高)和列数(宽),其余均与等比例缩放时的调用相同,这里不再赘述。

2.Visual C++实现

利用Visual C++实现图像的等比例缩放的代码如下。

      /*******************
      void CImgProcess::Scale(CImgProcess * pTo, double times)
       功能:     图像的等比例缩放
       注:       包括扩大缩小,图像大小不变
       参数:     CImgProcess * pTo:处理后得到的图像的CImgProcess指针
                 double times:缩放因子
       返回值:   无
      *******************/
      void CImgProcess::Scale(CImgProcess* pTo, double times)
      {
            int nHeight = pTo->GetHeight();
            int nWidth = pTo->GetWidthPixel();

            int i, j;
            for(i=0; i<nWidth; i++)
            {
                for(j=0; j<nHeight; j++)
                {
                  if(int(i*1/times+0.5)<nWidth && int(j*1/times+0.5)<nHeight)
                        pTo->SetPixel(i, j, GetPixel(int(i*1/times+0.5), int(j*1/times+0.5)));
                      else
                          pTo->SetPixel(i, j, RGB(255,255,255));
                }//for j
            }//for i
      }

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

      // 调用Scale()函数实现图像缩放
      imgInput.Scale(&imgOutput, fZoomRatio);

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

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