【问题标题】:Blur function in CS50 pset4 not fully workingCS50 pset4 中的模糊功能无法完全正常工作
【发布时间】:2020-06-05 07:57:22
【问题描述】:

我花了两天时间尝试纠正我的函数以模糊给定图像,但尽管进行了广泛的校对,但它现在仅适用于极端情况。对于其余部分,它会在 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;
}

【问题讨论】:

    标签: c blur cs50


    【解决方案1】:

    我假设您要为每个像素重置计数、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
    

    【讨论】:

    • 前段时间我有一个关于“像素化”图像的问题,这似乎与“模糊”相同。请参阅:stackoverflow.com/questions/56092019/…
    • 你是个救命稻草,杰夫,谢谢你,我早该想到的。还要感谢保罗!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多