CS50 pset4中的模糊功能无法正常工作

时间:2020-06-05 07:57:22

标签: c blur cs50

我花了两天的时间来纠正我对模糊给定图像的功能,但是尽管进行了广泛的校对,但现在它仅适用于极端情况。对于其余部分,它会在RGB值中产生2-20 +的差异。

该任务是哈佛大学CS50课程的一部分(有关pset4 https://cs50.harvard.edu/x/2020/psets/4/filter/less/的更多信息)。

我已经阅读了所有可以在网上找到的所有内容,并尝试使用这些技巧,例如用浮点数分隔新的RGB值,将结果直接复制回原始图像,调整if条件,但这无济于事,我仍然有不知道怎么了非常感谢您的帮助,谢谢!

 // Blur image
 void blur(int height, int width, RGBTRIPLE image[height][width])
 {
    float new_red, new_blue, new_green;
    new_red = new_blue = new_green = 0;

    int count = 0;

    // Copy the image
    RGBTRIPLE temp[height][width];

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            temp[i][j] = image[i][j];
        }
    }

    // Loop through height
    for (int i = 0; i < height; i++)
    {
        // Loop through width
        for (int j = 0; j < width; j++)
        {
            // Loop through rows around a pixel
            for (int k = -1; k <= 1; k++)
            {
                // Loop through columns around a pixel
                for (int m = -1; m <= 1; m++)
                {
                    if (i + k >= 0 && i + k < height && j + m >= 0 && j + m < width)
                    {
                        count++;
                        new_red += temp[i + k][j + m].rgbtRed;
                        new_blue += temp[i + k][j + m].rgbtBlue;
                        new_green += temp[i + k][j + m].rgbtGreen;
                    }
                }
            }

            temp[i][j].rgbtBlue = round(new_blue / count);
            temp[i][j].rgbtRed = round(new_red / count);
            temp[i][j].rgbtGreen = round(new_green / count);
        }

    }

    // Copy the blurred image to original file
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            image[i][j] = temp[i][j];
        }
    }

    return;
}

1 个答案:

答案 0 :(得分:2)

我假设您要重置每个像素的计数,new_blue,new_red和new_green。在代码中,这些值在处理图像时会继续增长。

// Loop through height
for (int i = 0; i < height; i++)
{
    // Loop through width
    for (int j = 0; j < width; j++)
    {
        count = new_blue = new_red = new_green = 0;

在调试时可能会发现的一种方法是,在进行除法和赋值之前,为每个像素打印这些变量的值。您可能已经注意到计数值太高。

我相信另一个问题是您正在模糊临时图像中的像素。当您模糊像素时,将使用其上方像素的已经模糊的值。相反,您可能想在最内层的循环中使用原始图像:

                    new_red += image[i + k][j + m].rgbtRed;
                    new_blue += image[i + k][j + m].rgbtBlue;
                    new_green += image[i + k][j + m].rgbtGreen