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

本人正在学习数字图像处理方面的知识,学习到图像的旋转变换了,在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);

大家看看对不对,别万一我错了,那可就不好了……

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值