CS50 Pset4棕褐色过滤器,错误在哪里?该代码未通过CS50测试

时间:2020-05-28 17:02:23

标签: cs50

所以这是我用于棕褐色过滤器的Pset4的代码……它朝着正确的方向前进,但是我一直在试图弄清为什么它没有通过测试。无法过滤简单的3 x 3图像或复杂的3 x 3图像或4 x 4图像。试图找出错误的位置,任何提示都将是很棒的!

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {

        // get values of each colour in the image
        int red = image[i][j].rgbtRed;
        int blue = image[i][j].rgbtBlue;
        int green = image[i][j].rgbtGreen;

        // find average of the pixel RBG colors
        float average = (round(red) + round(blue) + round(green)) / 3;
        average = round(average);

        //puts the value average into the pixel colors
        image[i][j].rgbtRed = average;
        image[i][j].rgbtBlue = average;
        image[i][j].rgbtGreen = average;
    }
}
return;

}

void sepia(int height, int width, RGBTRIPLE image[height][width]) 
{ 
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
      {
        //gets the values of each color in the image
        int red = image[i][j].rgbtRed;
        int blue = image[i][j].rgbtBlue;
        int green = image[i][j].rgbtGreen;

        // gets the sepia value of the pixels
        int sepiaRed = round(0.393 * red + 0.769 * green + 0.189 * blue);


        int sepiaGreen = round(0.349 * red + 0.686 * green + 0.168 * blue);


        int sepiaBlue = round(0.272 * red + 0.534 * green + 0.131 * blue);


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

        }

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

        }


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

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


    }
    return;
}

}

2 个答案:

答案 0 :(得分:0)

我不确定,没有看到更多代码。但是,在将它们的值保存到图像之前,难道不应该将这三个if放在最后吗?像这样:

...
        if (sepiaRed >= 256)
        {
            sepiaRed = 255;

        }

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

        }


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

        }

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

首先检查计算值是否不超过255。然后将这些值保存到图像中。 另外,您应将“ else if”替换为“ if”,以检查所有三个值(不超过一个)。然后编辑sepiaRed,sepiaBlue,sepiaGreen的值不是红色,蓝色,绿色。 我不确定该函数应该做什么。

答案 1 :(得分:0)

您必须使用数学函数round(),我的工作正常。

for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {
        //gets the values of each color in the image
        int red = image[i][j].rgbtRed;
        int blue = image[i][j].rgbtBlue;
        int green = image[i][j].rgbtGreen;

        // gets the sepia value of the pixels
        int sepiaRed = round(0.393 * red + 0.769 * green + 0.189 * blue)  ;


        int sepiaGreen = round(0.349 * red + 0.686 * green + 0.168 * blue) ;


        int sepiaBlue = round(0.272 * red + 0.534 * green + 0.131 * blue) ;




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

            }

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

            }


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

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


    }

}