基于错切变换的图像旋转

来源:互联网 发布:c语言define函数 编辑:程序博客网 时间:2024/06/05 07:11

之前写图形学作业用到的,今天看书的时候又看到了,加深了印象和理解,所以顺便就记下来。

图像旋转

[cosθsinθsinθcosθ][SxSy]=[DxDy]

但是这种方法最明显的缺点就是会使新的图像有空白点。也可以通过在目标图像中通过旋转矩阵的逆矩阵来找原图像中对应的点,需要用到一些插值算法(打算写缩放的时候再研究研究)。下面这个方法实现比较简单,而且运算速度比较快,对于每个点只需要进行三次浮点数乘法(最基础的正向旋转都需要进行4次浮点数乘法)。

通过三次错切变换实现旋转

因为

[cosθsinθsinθcosθ]=10cosθ1sinθ1[1sinθ01]10cosθ1sinθ1

即一次旋转变换可以看成依次进行三次错切变换。对于每次错切变换,
[10s1][SxSy]=[Sx+SxsSy]

sSy 为最近的整数 d,就相当于对每一行的每个像素点平移d的距离, 不会造成像素的丢失(垂直方向的错切变换同理)。因此三次错切变换后也不会造成像素的缺失。
测试效果如下:
原三角形填充
这里写图片描述

绕中点逆时针旋转30∘
这里写图片描述

绕中点逆时针旋转 120∘
这里写图片描述

但是三次取整使得精度会有所丢失,因此图像旋转的角度与原需要角度可能会有所偏差。而且就我写的代码来看,当旋转角度处于 170190之间时,图像比较诡异。(大概是因为cosθ1sinθ太大的关系)

原创粉丝点击