旋转图像的需求,在图片处理的过程中非常常见。我们知道对于计算机而言,图像其实就是一组像素点的集合,所以图像旋转的问题,本质上就是一个二维数组的旋转问题。
我们可以给定一个二维数组,用来表示一个图像,然后将它顺时针旋转90°。例如,对于4×4的矩阵:
{
{ 5, 1, 9, 11},
{ 2, 4, 8, 10},
{ 13, 3, 6, 7},
{ 15, 14, 12, 16}
}
旋转之后变为:
{
{ 15, 13, 2, 5},
{ 14, 3, 4, 1},
{ 12, 6, 8, 9},
{ 16, 7, 10, 11}
]
根据数学上矩阵的特性,可以把矩阵A先做转置得到AT,然后再翻转每一行就可以了。
#include<iostream>
using namespace std;int main()
{const int n = 4;int image[n][n] = {{ 5, 1, 9, 11},{ 2, 4, 8, 10},{ 13, 3, 6, 7},{ 15, 14, 12, 16}};//1、矩阵转置for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) {//以对角线为对称轴,两边元素进行互换int temp = image[i][j];image[i][j] = image[j][i];image[j][i] = temp;}}//2、对每一行进行前后翻转for (int i = 0; i < n; i++) {for (int j = 0; j < n / 2; j++) {int temp = image[i][j];image[i][j] = image[i][n-1-j];image[i][n-1-j] = temp;}}// 打印输出for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cout << image[i][j] << "\t";}cout << endl;}}
运行结果: