旋转图像的需求,在图片处理的过程中非常常见。我们知道对于计算机而言,图像其实就是一组像素点的集合,所以图像旋转的问题,本质上就是一个二维数组的旋转问题。
我们可以给定一个二维数组,用来表示一个图像,然后将它顺时针旋转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;
}
}
运行结果: