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

CS50 Pset4 sepia滤镜公式计算RGB值输出错误求助

CS50 Pset4 Sepia滤镜输出错误排查

测试像素(20, 40, 90)时,预期输出为56 50 39,实际得到39 50 0,问题代码如下:

// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
    int i = 0;
    int j = 0;
    int oRed;
    int oGreen;
    int oBlue;
    int sepiaBlue;
    int sepiaGreen;
    int sepiaRed;


    for (i = 0; i < height; i++)
    {
        for (j = 0; j < width; j++)
        {
            oRed = image[i][j].rgbtRed;
            oGreen = image[i][j].rgbtGreen;
            oBlue = image[i][j].rgbtBlue;
            sepiaRed = round((.393 * oRed) + (.769 * oGreen) + (.189 * oBlue));
            sepiaGreen = round((.349 * oRed) + (.686 * oGreen) + (.168 * oBlue));
            sepiaRed = round((.272 * oRed) + (.534 * oGreen) + (.131 * oBlue));

            if (sepiaRed > 255)
            {
                sepiaRed = 255;
            }

            if (sepiaGreen > 255)
            {
                sepiaGreen = 255;
            }

            if (sepiaBlue > 255)
            {
                sepiaBlue = 255;
            }

            image[i][j].rgbtRed = sepiaRed;
            image[i][j].rgbtGreen = sepiaGreen;
            image[i][j].rgbtBlue = sepiaBlue;
        }
    }

    return;
}

错误原因分析

  1. 重复赋值覆盖sepiaRed:计算完正确的sepiaRed后,错误地将原本属于sepiaBlue的公式再次赋值给sepiaRed,导致最终的sepiaRed是原公式中sepiaBlue的计算结果(39),正确的sepiaRed(56)被覆盖丢失。
  2. sepiaBlue未初始化赋值:变量sepiaBlue仅声明但从未进行计算赋值,直接使用时会取到栈上的随机值(本次测试中为0),完全不符合预期。

修正后的代码

// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
    int i = 0;
    int j = 0;
    int oRed;
    int oGreen;
    int oBlue;
    int sepiaBlue;
    int sepiaGreen;
    int sepiaRed;


    for (i = 0; i < height; i++)
    {
        for (j = 0; j < width; j++)
        {
            oRed = image[i][j].rgbtRed;
            oGreen = image[i][j].rgbtGreen;
            oBlue = image[i][j].rgbtBlue;
            // 正确分配三个通道的计算公式
            sepiaRed = round((.393 * oRed) + (.769 * oGreen) + (.189 * oBlue));
            sepiaGreen = round((.349 * oRed) + (.686 * oGreen) + (.168 * oBlue));
            sepiaBlue = round((.272 * oRed) + (.534 * oGreen) + (.131 * oBlue));

            // 确保值不超过255
            if (sepiaRed > 255)
            {
                sepiaRed = 255;
            }

            if (sepiaGreen > 255)
            {
                sepiaGreen = 255;
            }

            if (sepiaBlue > 255)
            {
                sepiaBlue = 255;
            }

            image[i][j].rgbtRed = sepiaRed;
            image[i][j].rgbtGreen = sepiaGreen;
            image[i][j].rgbtBlue = sepiaBlue;
        }
    }

    return;
}

修正后重新测试像素(20,40,90),即可得到预期的56 50 39输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:02:29