基于错切变换的图像旋转

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

图像旋转

[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的距离, 不会造成像素的丢失(垂直方向的错切变换同理)。因此三次错切变换后也不会造成像素的缺失。
测试效果如下:
原三角形填充
基于错切变换的图像旋转_第1张图片

绕中点逆时针旋转30∘
基于错切变换的图像旋转_第2张图片

绕中点逆时针旋转 120∘
基于错切变换的图像旋转_第3张图片

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

你可能感兴趣的:(图形学)