You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50x PSET4 filter-more的blur函数边角像素滤波异常排查

CS50x PSET4 filter-more blur函数边缘像素计算错误排查

问题根因

你的代码对所有像素的邻域RGB总和固定除以9计算平均值,是边缘、角落像素结果错误的唯一核心原因:

  • 图像非边缘的中间区域像素,3x3邻域共9个像素全部落在图像范围内,除以9的计算逻辑完全正确,对应你观察到的中间区域结果符合预期的现象
  • 图像非角落的边缘像素,3x3邻域有3个像素超出图像边界,实际参与计算的有效像素仅6个,固定除以9会导致计算出的平均值偏低
  • 图像四个角落的像素,3x3邻域有5个像素超出图像边界,实际参与计算的有效像素仅4个,固定除以9的计算结果偏差会更明显

修正方向

不需要改动你现有的边界判断逻辑,只需要补充有效像素计数即可:

  • 在遍历每个像素的两层循环内部、开始遍历3x3邻域之前,新增一个整型计数器变量,初始值设为0
  • 每次判定邻域坐标合法、累加RGB通道总和的时候,同步给计数器加1
  • 计算三个通道平均值时,将固定除以9.0的逻辑改为除以计数器转成的浮点数,再做round取整

修正后的核心代码片段

for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {
        // 统计当前像素邻域内的有效像素个数
        int valid_count = 0;
        red_total = blue_total = green_total = 0;

        for (int h = -1; h < 2; h++)
        {
            if (i + h >= 0 && i + h < height)
            {
                for (int k = -1; k < 2; k++)
                {
                    if (j + k >= 0 && j + k < width)
                    {
                        red_total += image[i + h][j + k].rgbtRed;
                        blue_total += image[i + h][j + k].rgbtBlue;
                        green_total += image[i + h][j + k].rgbtGreen;
                        // 有效像素计数累加
                        valid_count++;
                    }
                }
            }
        }

        // 按实际有效像素数计算平均值
        red_average = round(red_total / (float)valid_count);
        blue_average = round(blue_total / (float)valid_count);
        green_average = round(green_total / (float)valid_count);

        temp[i][j].rgbtBlue = blue_average;
        temp[i][j].rgbtRed = red_average;
        temp[i][j].rgbtGreen = green_average;
    }
}

注:你原代码里的临时数组创建、遍历后拷贝回原图像、总和变量重置的逻辑都是正确的,不需要改动。代码中多余的else continue语句不影响运行结果,仅属于冗余写法,可自行选择是否删除。

内容的提问来源于stack exchange,提问作者camelCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:12:22