【问题标题】:CS50 Filter(less) blur functionCS50 Filter(less) 模糊功能
【发布时间】:2020-08-11 19:32:57
【问题描述】:

我对 CS 非常陌生,我想我会向社区寻求帮助。我已经在过滤器(更少)pset 的模糊功能上停留了 6 个多小时,并且尝试了很多变化和适应,但似乎没有通过检查 50。

我非常感谢任何见解或建议(越详细越好)!

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

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            for (int h = - 1; h < 2; h++)
            { 
                float counter = 0.0; 
                int avgGreen = 0;
                int avgRed = 0;
                int avgBlue = 0;
                for (int k = - 1; k < 2; k++)
                {
                    if (i + h < 0 || i + h > height -1)
                    {
                        continue; 
                    }
                    if (j + k < 0 || j + k > width - 1)
                    {
                        continue; 
                    }
                    avgGreen += copy[i + h][j + k].rgbtGreen;
                    avgBlue += copy[i + h][j + k].rgbtBlue;
                    avgRed += copy[i + h][j + k].rgbtRed;
                    counter++;
                }
            image[i][j].rgbtRed = round(avgred/ counter);
            image[i][j].rgbtBlue = round(avgblue/ counter);
            image[i][j].rgbtGreen = round(avggreen/ counter);
            }
        }
    }
    return;
}

【问题讨论】:

    标签: c cs50


    【解决方案1】:
    1. 您在k 的内部for 循环中定义和归零avgGreenavgBlueavgRed。您需要在该循环之外执行此操作,但在 j 的循环中。

    2. 有一个浮动计数器很奇怪。我建议使用int。但请注意,在进行除法时,您仍然希望转换为浮动;否则round 函数将不起作用(因为除法的结果总是会被截断)。

    3. 最后,您引用avgredavgblueavggreen,但这些是未定义的。 (检查大小写。)

    4. 将 RGB 值分配给 image[i][j] 的三行位于 h 上的 for 循环内。他们需要在那个循环之外。乍一看,它们似乎在该循环之外,因为它们的缩进不正确。这些行下方的} 需要在它们上方。

    5. 进行这些更改后,您的结果在功能上应该是正确的,但处理速度会很慢。如果您关心性能,则应避免在内部循环中进行比较。比较操作会破坏 CPU 的管道,这可能非常慢。您的内部循环中最多有四个比较。最好在两个内部循环之外进行这些比较,而是基于避免在像素缓冲区之外运行来找到hMinhMaxiMiniMax。然后您可以将hhMin 循环到hMax 并将iiMin 循环到iMax,以获得更好的速度。

    【讨论】:

    • 非常感谢@howlium!有效!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多