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

CS50x作业4 Filter More:灰度与模糊函数代码问题求助

CS50 Filter (More) 问题排查与修复

任务说明

对应CS50 2023年第4次作业的Filter (More)部分。

存在的两个问题

问题1:灰度化函数取整失效

编写的灰度化函数无法正确对三通道颜色值的平均值取整,尝试过round()和ceil()均无效。

问题2:盒式模糊函数全错

实现的3x3区域盒式模糊函数无法通过check50测试,结果完全错误。


代码错误分析与修复

1. 灰度化函数错误修复

原代码核心问题是整数除法截断:计算三通道总和除以3时,使用整数除法(/3)导致总和先被截断为整数,后续的ceil()或round()操作失去意义。

修复后的代码:

#include <math.h>

// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            // 用3.0触发浮点数除法,避免整数截断
            float avg = (image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3.0;
            int shade = round(avg);
            image[i][j].rgbtRed = shade;
            image[i][j].rgbtGreen = shade;
            image[i][j].rgbtBlue = shade;
        }
    }
    return;
}

修复要点:

  • 用3.0替代3,强制进行浮点数除法
  • 先计算浮点数平均值,再对平均值做取整操作

2. 盒式模糊函数错误修复

原代码存在三个关键错误:

  1. 外层循环越界:i <= height和j <= width会访问超出图像数组范围的索引(数组合法索引为0到height-1、0到width-1)
  2. 内层列循环范围错误:l < j + 1漏掉j+1列像素,仅覆盖2列而非3列
  3. 整数除法截断:avgR / count为整数除法,取整前未转为浮点数,导致平均值计算错误
  4. 多余操作:对单个整数像素值调用round()无意义

修复后的代码:

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE temp[height][width]; // 保存原始图像的临时数组

    // 复制原始图像到临时数组
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            temp[i][j] = image[i][j]; // 直接拷贝整个RGBTRIPLE结构体,简化代码
        }
    }

    // 遍历每个像素(修正循环条件,避免越界)
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            unsigned int sumR = 0, sumG = 0, sumB = 0;
            unsigned int count = 0;

            // 遍历3x3区域的行(i-1, i, i+1)
            for (int k = i - 1; k <= i + 1; k++)
            {
                // 遍历3x3区域的列(j-1, j, j+1,修正循环条件)
                for (int l = j - 1; l <= j + 1; l++)
                {
                    // 检查当前坐标是否在图像范围内
                    if (k >= 0 && k < height && l >= 0 && l < width)
                    {
                        sumR += temp[k][l].rgbtRed;
                        sumG += temp[k][l].rgbtGreen;
                        sumB += temp[k][l].rgbtBlue;
                        count++;
                    }
                }
            }

            // 转为浮点数计算平均值后取整,避免整数截断
            image[i][j].rgbtRed = round((float)sumR / count);
            image[i][j].rgbtGreen = round((float)sumG / count);
            image[i][j].rgbtBlue = round((float)sumB / count);
        }
    }
    return;
}

修复要点:

  • 外层循环条件改为i < height和j < width,避免越界访问
  • 内层列循环条件改为l <= j + 1,确保覆盖3x3区域所有列
  • 计算平均值时,将总和强制转为浮点数后再除以count,避免整数截断
  • 移除对单个像素值的多余round()操作

补充说明

灰度化函数中修改shade为float类型是正确方向,但需结合浮点数除法才能解决核心问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:09:52