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