数字图像处理成长之路5:仿射变换(旋转)

来源:互联网 发布:windows强制关机快捷键 编辑:程序博客网 时间:2024/05/20 03:48

今天学习affine transformation,这个变换充分体现了数学之美,怪不得有那么一句话,“科学中的皇后是数学”。

这个变换包含旋转,错切,翻转等,这里只通过学习旋转,来了解其中的共性。不同的变换只是核矩阵不同。

我们只来看看旋转,旋转是如何实现的,网上有关于旋转矩阵核的推导,很简单。
如:
http://ask.csdn.net/questions/218260

至于旋转的原理或者公式,网上也是很多,这里暂不多写。

这里写图片描述

这个是逆时针旋转了45度。

for (int i = 0; i < srcMat.cols ; i ++)  for (int j = 0; j < srcMat.rows ; j ++)    {//把图像坐标系转换成x, y坐标系      x = i - x0;      y = -(j - y0);     //对x,y 坐标系中的点作旋转变换      X =  x * cos(w) - y * sin(w);      Y =  x * sin(w) + y * cos (w);      //如果变换后的坐标不超出x, y坐标系的四周      if ( -(srcMat.cols - x0 ) < X and           X  < srcMat.cols - x0 and            -(srcMat.rows - y0) < Y and            Y < srcMat.rows - y0)           {//把x,y坐标系还原成图像坐标系              X = X + x0;              //Y = Y-y0,恢复到第四象限              //前面取负,让Y值变正              Y = -(Y - y0);              tmpMat.at<uchar>(Y, X) =              srcMat.at<uchar>(j, i);            }        }

程序并不复杂,实现了绕中心点x0, y0的逆时针旋转。但是由于用的坐标系不同,需要进行变换,而变换这一块倒是容易让人想不明白。

原创粉丝点击