CS50(2019)习题集&过滤器&:模糊&不知何故不能正常工作习题集、何故、过滤器、不能正常

2023-09-03 12:15:51 作者:想念你的味道

所以,我花了大约5个小时以上的时间试图找出我的代码出了什么问题。我试着用我在Paint中手动创建的3x3文件调试50,一切似乎都按预期进行;每个像素围绕自身进行3x3扫描,并忽略不存在的像素,如角落或边缘中的像素。每种颜色的最终平均值也是正确的。然而,不知何故,当我用check 50检查时,它给出了以下消息:

青州袋式过滤器 青州精密过滤器 天瑞

经过无数次的调整和挠头,我决定可能是时候向社区寻求帮助了。以下是我的代码:

{
    for (int h = 0; h < height; h++)
    {
        for (int w = 0; w < width; w++)
        {
            int avgfordiv = 0;
            int neighvalgreen = 0;
            int neighvalblue = 0;
            int neighvalred = 0;

            for (int hh = -1; hh < 2; hh++)
            {
                for (int ww = -1; ww < 2; ww++)
                {
                    if ((h+hh) != height && (w+ww) != width && (h+hh) != -1 && (w+ww) != -1)
                    {
                        //sweep
                        avgfordiv++;//count up for division
                        neighvalgreen += image[h + hh][w + ww].rgbtGreen;
                        neighvalred += image[h + hh][w + ww].rgbtRed;
                        neighvalblue += image[h + hh][w + ww].rgbtBlue;
                    }
                }
            }
            //add values to pixels
             image[h][w].rgbtGreen = (int)(round((float)neighvalgreen / avgfordiv));
             image[h][w].rgbtBlue = (int)(round((float)neighvalblue / avgfordiv));
             image[h][w].rgbtRed = (int)(round((float)neighvalred / avgfordiv));

            //check cap
             if (image[h][w].rgbtGreen <= 255)
                {}
            else
                image[h][w].rgbtGreen %= 255;

            if (image[h][w].rgbtRed <= 255)
                {}
            else
                image[h][w].rgbtRed %= 255;

            if (image[h][w].rgbtBlue <= 255)
                {}
            else
                image[h][w].rgbtBlue %= 255;
        }
    }
    return;
}

推荐答案

复制图像并使用该副本计算红色、绿色和蓝色的总量似乎可以修复它。

RGBTRIPLE copy[height][width];
for (int h = 0; h < height; i++)
{
    for (int w = 0; w < width; j++)
    {
        copy[h][w] = image[h][w];
    }
}

并将其更改为:

neighvalgreen += copy[h + hh][w + ww].rgbtGreen;
neighvalred += copy[h + hh][w + ww].rgbtRed;
neighvalblue += copy[h + hh][w + ww].rgbtBlue;

此外,您不需要检查这些值是否超过255,因为您正在计算平均值,因此它永远不会超过255。