资源描述
图像的任意角度旋转,学号:1234567789姓名:SmartKingbo,LOGO,理论基础,图像的旋转是图像的几何变换的一种。一般来说,图像的旋转是以图像的中心为原点,将图像上所有像素都旋转相同的角度。图像旋转后,图像的大小一般会改变,在图像的旋转变换中既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所有的图像。,原图,旋转后图像大小不变,旋转后图像变大,以顺时针旋转为例来推导旋转变换公式。如下图所示。,旋转前:,旋转a角度后:,(1-1),(1-2),矩阵形式:,(1-3),上述旋转是绕坐标轴原点(0,0)进行的,向右为X轴为正方向,向上为Y轴正方向,设为坐标系。而屏幕中的坐标是以左上角为原点,向右为X轴正方向,向下为Y轴正方向,设为坐标系。要按图像的中心点(a,b)旋转,首先要进行坐标系的平移。,设图像宽度为W,高度为H,则由坐标系平移到的变换矩阵为:,(1-4),其逆变换矩阵表达式为:,(1-5),因此,可按如下方法旋转图像:根据式(1-4),将坐标系变成坐标系;根据式(1-3),将该点顺时针旋转a角度;根据式(1-5),将坐标系变成坐标系。,假设图像在新的坐标系下,以旋转后的新图像左上角为原点,为旋转时中心坐标为(a,b),旋转后图像中心坐标为(c,d),则可得到旋转变换矩阵表达式为:,(1-6),即:,这样,原图中的每一点经过旋转之后新图中都有与之对应的点。编程运行后结果如图所示:,原图,旋转后的新图(变大且有空白点),我们会发现新图像上有许多空白点,且随着角度的不同空白点的具体位置也会不同。为什么会出现空白点呢?,如何解决?,插值处理!,插值处理,最邻近插值和双线性插值,插值和不插值的一点区别:不插值:代码实现时是遍历原图像插值:代码实现时是遍历新图像,因此实现插值就在遍历新图的过程中做文章。式(1-6)的逆变换矩阵为:,(1-7),即:,这样,对于新图中的每一点,可以求出对应于原图中的点,然后把相应的颜色值赋给新图。插值就是把新图中的空白点(不带四个角)也映射到原图中的某一个点(最邻近插值)或者用原图中的几个点求一个颜色值赋给新图中的空白点(双线性插值)。,1.最邻近插值最邻近插值也称零阶插值。它输出的像素的颜色值就等于距离它映射到的位置最近的原图像素的颜色值,怎么取最近呢?用四舍五入的方法。结果图像带有锯齿形的边。,核心代码:x0=(int)(x1*cosa+y1*sina+temp1+0.5);y0=(int)(-1*x1*sina+y1*cosa+temp2+0.5);,效果图如下所示:,2.双线性插值双线性插值算法又称一阶插值算法,他的效果好于最邻近插值算法。,设,step1:step2:step3:,用双线性插值时,针对灰度图像和24位彩色图像分别自定义了两个个函数:unsignedcharInterpolation(BYTE*,int,int,float,float);unsignedcharInterpolation1(BYTE*,int,int,float,float,int);具体代码见程序。,双线性插值效果图如下所示:,感谢您的关注,
展开阅读全文