C 语言实现旋转图像

一、项目介绍

图像旋转是一种常见的图像处理操作,主要应用于 计算机视觉、游戏开发、图像编辑 等领域。本项目使用 C 语言 读取一个 二维矩阵(图像像素数据),并对其进行 顺时针或逆时针旋转 90°


二、项目实现思路

1. 旋转规则

给定一个 N × N 的二维数组(矩阵)表示图像:

1  2  3
4  5  6
7  8  9

顺时针旋转 90° 结果:

7  4  1
8  5  2
9  6  3

逆时针旋转 90° 结果:

3  6  9
2  5  8
1  4  7

2. 旋转方法

  • 顺时针 90° 旋转

    • 先转置矩阵(行变列)。
    • 再水平翻转(交换左右列)。
  • 逆时针 90° 旋转

    • 先转置矩阵(行变列)。
    • 再垂直翻转(交换上下行)。

三、C 语言实现代码

#include <stdio.h>

#define N 3  // 定义图像矩阵大小

// 显示矩阵
void displayMatrix(int matrix[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

// 旋转矩阵顺时针 90°
void rotateClockwise(int matrix[N][N]) {
    // 1. 转置矩阵(matrix[i][j] 交换 matrix[j][i])
    for (int i = 0; i < N; i++) {
        for (int j = i + 1; j < N; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }

    // 2. 水平翻转(左右交换)
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N / 2; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[i][N - j - 1];
            matrix[i][N - j - 1] = temp;
        }
    }
}

// 旋转矩阵逆时针 90°
void rotateCounterClockwise(int matrix[N][N]) {
    // 1. 转置矩阵(matrix[i][j] 交换 matrix[j][i])
    for (int i = 0; i < N; i++) {
        for (int j = i + 1; j < N; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }

    // 2. 垂直翻转(上下交换)
    for (int i = 0; i < N / 2; i++) {
        for (int j = 0; j < N; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[N - i - 1][j];
            matrix[N - i - 1][j] = temp;
        }
    }
}

int main() {
    int image[N][N] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    printf("原始矩阵:\n");
    displayMatrix(image);

    // 顺时针旋转 90°
    rotateClockwise(image);
    printf("顺时针旋转 90°:\n");
    displayMatrix(image);

    // 逆时针旋转 90°(恢复原状)
    rotateCounterClockwise(image);
    printf("逆时针旋转 90°(恢复原始矩阵):\n");
    displayMatrix(image);

    return 0;
}

四、代码解读

1. displayMatrix()

  • 作用:打印 N × N 矩阵。

2. rotateClockwise()

  • 作用:顺时针旋转 90°。
  • 逻辑
    1. 转置矩阵(交换 matrix[i][j]matrix[j][i])。
    2. 水平翻转(交换 matrix[i][j]matrix[i][N-j-1])。

3. rotateCounterClockwise()

  • 作用:逆时针旋转 90°。
  • 逻辑
    1. 转置矩阵(交换 matrix[i][j]matrix[j][i])。
    2. 垂直翻转(交换 matrix[i][j]matrix[N-i-1][j])。

五、示例运行

运行结果:

原始矩阵:
1 2 3 
4 5 6 
7 8 9 

顺时针旋转 90°:
7 4 1 
8 5 2 
9 6 3 

逆时针旋转 90°(恢复原始矩阵):
1 2 3 
4 5 6 
7 8 9 

六、扩展功能

1. 旋转 180°

思路

  • 连续调用两次 rotateClockwise()rotateCounterClockwise()
  • 或者直接 对角翻转 + 水平翻转
void rotate180(int matrix[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N / 2; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[N - i - 1][N - j - 1];
            matrix[N - i - 1][N - j - 1] = temp;
        }
    }
}

2. 旋转 M × N 矩阵

对于 非方形矩阵

  • 创建新矩阵,将 matrix[i][j] 重新映射到 [j][M-1-i]
void rotateRectangular(int rows, int cols, int matrix[rows][cols], int result[cols][rows]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            result[j][rows - i - 1] = matrix[i][j]; // 映射规则
        }
    }
}

七、项目总结

1. 主要功能

实现矩阵(图像)旋转 90°
支持顺时针和逆时针旋转
可扩展到 M × N 矩阵

2. 可优化方向

  • 使用更通用的数据结构(如 malloc 分配动态大小)。
  • 支持任意角度旋转(使用 数学变换 + 插值)。
  • 支持灰度图像或彩色图像的旋转

八、总结

本项目 用 C 语言实现了二维图像的旋转,包括 90° 顺时针、逆时针旋转,并支持 非方形矩阵。这是 计算机图形学和图像处理的基础算法,可用于 图像编辑软件、游戏开发、人工智能图像处理 等场景。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐