图片旋转,本质上是对旋转后的图片中每个像素点计算在原图的位置。然后照搬过来就好。
(多说一句,如果计算出来在原图中的位置不是整数而是小数,因为像素点个数都是整数,就需要小数到整数的转换。这个转换过程是有讲究的,需要用到插值:最近邻插值、双线性插值等等。这里我使用的是最简单的最近邻插值,即对小数四舍五入成整数,C/C++
实现四舍五入见这里)
完整 github 代码:image-processing (里面同时包含OSTU
/ 大津算法、直方图均衡化、滤波器等算法,还包括两种测试图片)。
图形图像课上一般会介绍旋转变换矩阵,其中 t 为需要旋转的角度,[x'; y']是变换后坐标(其中分号表示上下关系):
即表示为:[x'; y'] = [cos(t) sin(t); -sin(t) cos(t)][x; y]
用OpenCV中的Mat格式存储(或二维数组)的图片,原点在左上角。但是想要实现的旋转原点在图片中心。
同时,Mat格式存储(或二维数组)的坐标系中y轴正方向向下。这样人类视觉上的顺时针旋转,在二维数组的坐标系中是逆时针旋转。
最重要的一点,也是二维数组操作中极易忽略的一点:数组操作的是数组下标,不是坐标系(数组的行数rows是矩形的宽width,列数cols是矩形的长lengt