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

4.4 图像转置

图像转置是将图像像素的x坐标和y坐标互换,如图4.6所示。图像的大小会随之改变——高度和宽度将互换。

图4.6 转置变换坐标图

4.4.1 图像转置的变换公式

转置变换的公式如下:

显然,转置矩阵的逆矩阵仍为其自身。故转置变换的逆变换具有相同的形式。

4.4.2 图像转置的实现

1.MATLAB编程实现

转置变换的实现程序如下。

      % 图像转置
      A=imread('girl.bmp');
      tform = maketform('affine', [0 1 0;1 0 0; 0 0 1]);
      %定义转置变换矩阵
      B = imtransform(A, tform, 'nearest');
      subplot(1,2,1), imshow(A);
      title(’原图像’);
      subplot(1,2,2), imshow(B);
        title(’图像转置’);

转置结果如图4.7所示。

图4.7 转置效果图

2.Visual C++实现

利用Visual C++实现图像转置变换的程序如下。

      /*******************
      void CImgProcess::Transpose(CImgProcess * pTo)
       功能:     图像的转置
       注:       图像水平竖直方向互换,图像大小不变
       参数:     CImgProcess * pTo:处理后得到的图像的CImgProcess指针
       返回值:   无
      *******************/
      void CImgProcess::Transpose(CImgProcess* pTo)
      {
            int nHeight = pTo->GetHeight();
            int nWidth = pTo->GetWidthPixel();

            int i, j;
                 for(i=0; i<nWidth; i++)
            {

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

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

      // 调用Transpose()函数实现图像的转置
      imgInput.Transpose(&imgOutput);

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

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

在学习了4.6节图像旋转之后,有兴趣的读者也可尝试通过先水平镜像,再逆时针旋转90°的方式来实现图像转置。