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

CS50 PSET4 Box Blur滤镜程序输出黑色图片,求错误排查

盒子模糊(Box Blur)代码输出黑色图片的问题排查

你的代码运行后输出黑色图片,核心问题有两个:

  • 未初始化sum变量:你定义了RGBTRIPLE sum;但没有将它的rgbtRed、rgbtGreen、rgbtBlue分量初始化为0。这些变量会保留内存中的随机垃圾值,累加后结果完全错误,最终计算出的平均值大概率是0或接近0的数值,导致图片全黑。
  • 边界判断逻辑错误:判断像素是否越界时,xarr[x] > width和yarr[y] > height的写法错误。图像的列索引范围是0到width-1,当xarr[x]等于width时就已经超出有效范围,应该改成xarr[x] >= width;同理行索引范围是0到height-1,判断条件要改成yarr[y] >= height。之前的错误会导致访问非法内存,进一步加剧数值异常。

另外,你遍历周围9个像素的写法比较绕,换成双重循环会更清晰,也不容易出错。修正后的代码如下:

// 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];
        }
    }

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            int sum_red = 0, sum_green = 0, sum_blue = 0;
            int count = 0;

            // 遍历当前像素周围3x3的区域
            for (int dy = -1; dy <= 1; dy++)
            {
                for (int dx = -1; dx <= 1; dx++)
                {
                    int y = i + dy;
                    int x = j + dx;
                    // 判断是否在图像范围内
                    if (y >= 0 && y < height && x >= 0 && x < width)
                    {
                        sum_red += temp[y][x].rgbtRed;
                        sum_green += temp[y][x].rgbtGreen;
                        sum_blue += temp[y][x].rgbtBlue;
                        count++;
                    }
                }
            }

            // 计算平均值并赋值
            image[i][j].rgbtRed = round((float)sum_red / count);
            image[i][j].rgbtGreen = round((float)sum_green / count);
            image[i][j].rgbtBlue = round((float)sum_blue / count);
        }
    }
    return;
}

内容的提问来源于stack exchange,提问作者need-help

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:22:46