自学内容网 自学内容网

Leecode刷题C语言之图像平滑器

执行结果:通过

执行用时和内存消耗如下:

题目:图片平滑器

图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。

每个单元格的  平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。

如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。

给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像 。

示例 1:

输入:img = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[0, 0, 0],[0, 0, 0], [0, 0, 0]]
解释:
对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0

解题思路:

这段代码的目的是对一个二维整数数组(图像)进行平滑处理,即对每个元素,计算它周围3x3区域(包括自身)的平均值,并将这个平均值作为处理后图像中对应位置的新值。下面是详细的解题思路:

  1. 定义辅助函数Mean
    • 参数解释
      • int i, int j:当前处理的元素在二维数组中的行索引和列索引。
      • int** M:指向二维整数数组的指针。
      • int MSize:二维数组的行数。
      • int* MColSize:指向一个数组的指针,该数组包含二维数组中每一列的元素数量(这里假设所有列的长度相同,因此可以通过*MColSize获取列数)。
    • 功能:
      • 计算二维数组中位置(i, j)周围3x3区域(包括(i, j)本身)的元素和sum,以及有效元素的个数count
      • 返回这个区域的平均值(sum / count)。
    • 实现细节:
      • 使用两层嵌套循环遍历(i, j)周围的3x3区域(pq分别表示行和列的索引,从i-1i+1,从j-1j+1)。
      • 检查索引是否越界(即是否在数组的范围内),如果在范围内,则将元素值加到sum,并增加count
      • 返回平均值。
  2. 定义主函数imageSmoother
    • 参数解释:
      • int** M:指向二维整数数组的指针,表示原始图像。
      • int MSize:二维数组的行数,即图像的高度。
      • int* MColSize:指向一个数组的指针,该数组包含二维数组中每一列的元素数量,这里假设所有列的长度相同,因此可以通过*MColSize获取列数,即图像的宽度。
      • int* returnSize:用于存储处理后图像的尺寸(行数)。
      • int** returnColumnSizes:用于存储处理后图像每列的尺寸(这里假设所有列长度仍然相同,因此实际上存储的是列数)。
    • 功能:
      • 创建一个新的二维整数数组ret,用于存储平滑处理后的图像。
      • 初始化*returnSize为原始图像的行数MSize
      • *returnColumnSizes分配内存,并初始化为原始图像的列数*MColSize
      • 使用两层嵌套循环遍历原始图像的每个元素,对每个元素调用Mean函数计算其3x3区域的平均值,并将这个平均值存储在ret数组的相应位置。
    • 返回值:
      • 返回指向处理后图像的指针ret
  3. 整体流程:
    • 调用imageSmoother函数,传入原始图像和尺寸信息。
    • 函数内部创建一个新的二维数组用于存储平滑处理后的图像。
    • 对原始图像的每个元素,计算其3x3区域的平均值,并更新到新数组中。
    • 返回处理后的图像数组及其尺寸信息。

通过上述步骤,原始图像中的每个元素都被其周围3x3区域的平均值所替换,从而实现图像的平滑处理

int Mean(int i, int j, int** M, int MSize, int* MColSize)
{
    int sum = 0;
    int count = 0;
    for (int p = i - 1; p <= i + 1; p++) {
        for (int q = j - 1; q <= j + 1; q++) {
            if (p >= 0 && p< MSize && q >= 0 && q < *MColSize) {
                sum += M[p][q];
                count++;
            }
        }
    }
    return sum / count;
}

int** imageSmoother(int** M, int MSize, int* MColSize, int* returnSize, int** returnColumnSizes)
{
    *returnSize = MSize;
    *returnColumnSizes = (int*)malloc(MSize * sizeof(int));
    int** ret = (int**)malloc(MSize * sizeof(int*));
    for (int i = 0; i < MSize; i++) {
        ret[i] = (int*)malloc(*MColSize * sizeof(int));
        (*returnColumnSizes)[i] = *MColSize;
    }
    for (int i = 0; i < MSize; i++) {
        for (int j = 0; j < *MColSize; j++) {
            ret[i][j] = Mean(i, j, M, MSize, MColSize);
        }
    }
    return ret;
}


原文地址:https://blog.csdn.net/babyiu5201314/article/details/143866990

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!