您的位置:首页 > 其它

关于vc中实现图像旋转的看法

2009-08-07 21:08 501 查看
本人正在学习数字图像处理方面的知识,学习到图像的旋转变换了,在csdn中看到不少的源码:

其中有这么两句:

// 两个常数,这样不用以后每次都计算了
f1 = (float) (-0.5 * (lNewWidth - 1) * fCosa - 0.5 * (lNewHeight - 1) * fSina
+ 0.5 * (lWidth - 1));
f2 = (float) ( 0.5 * (lNewWidth - 1) * fSina - 0.5 * (lNewHeight - 1) * fCosa
+ 0.5 * (lHeight - 1));

或者是:

j0= (int) (j*cos(angle) + i*sin(angle)
- xCenter*cos(angle) - yCenter*sin(angle) + xOriCenter + 0.5);
i0= (int) (-j*sin(angle) + i*cos(angle)
+ xCenter*sin(angle) - yCenter*cos(angle) + yOriCenter + 0.5);
我个人认为这两种方法其实是一样的,但是有一个错误,就是图像旋转的公式不对:
正确的应该为:

假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x0, y0)绕其中心(xcenter, ycenter)逆时针旋转angle角度后,新的坐标位置(x′, y′)的计算公式为:

xcenter = (right - left + 1) / 2 + left;
ycenter = (bottom - top + 1) / 2 + top;
x′ = (x0 - xcenter) cosθ - (y0 - ycenter) sinθ + xcenter;(1)
y′ = (x0 - xcenter) sinθ + (y0 - ycenter) cosθ + ycenter; (2)

而对于上面的两个我认为错误的,错误原因为:

由x′,y′推出x0和y0时才出错,(1)式子乘以cosθ,(2)式子乘以sinθ,两个式子相加得到的关于x0和y0的式子的最后一项应该为xCenter,但是csdn中的最后却加了一个xOriCenter ,
正确的应该为:
j0=(int)(j*cos(angle)+i*sin(angle)-xCenter*cos(angle)-yCenter*sin(angle)+xCenter+0.5);
i0=(int)(-j*sin(angle)+i*cos(angle)+xCenter*sin(angle)-yCenter*cos(angle)+yCenter+0.5);
大家看看对不对,别万一我错了,那可就不好了……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: