【问题标题】:The tests on my cs50 edge filter program are failing我的 cs50 边缘过滤器程序的测试失败了
【发布时间】:2020-04-21 19:48:21
【问题描述】:

我正在为 cs50 开发边缘程序。我在这个程序上遇到了很多问题,但我觉得我越来越接近了。如果有人可以帮助我解决可能出现的问题,我将不胜感激。

这是我的代码:

// Detect edges
void edges(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE copy[height][width];

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

for (int y = 0; y < height; y++)
{
    for (int x = 0; x < width; x++)
    {
        int gxred = 0;
        int gxgreen = 0;
        int gxblue = 0;
        int gyred = 0;
        int gygreen = 0;
        int gyblue = 0;
        for (int r = -1; r < 2; r++)
        {
            for (int s = -1; s < 2; s++)
            {
                if ((y + r < height && y + r >= 0) && (x + s < width && x + s >= 0))
                {
                    if (r == -1 || r == 1)
                    {
                        gxred += copy[y + r][x + s].rgbtRed * s;
                        gxgreen += copy[y + r][x + s].rgbtGreen * s;
                        gxblue += copy[y + r][x + s].rgbtBlue * s;
                    }
                    if (r == 0)
                    {
                        gxred += copy[y + r][x + s].rgbtRed * (s * 2);
                        gxgreen += copy[y + r][x + s].rgbtGreen * (s * 2);
                        gxblue += copy[y + r][x + s].rgbtBlue * (s * 2);
                    }

                }
                if ((y + s < height && y + s >= 0) && (x + r < width && x + r >= 0))
                {
                    if (s == -1 || s == 1)
                    {
                        gyred += copy[y + s][x + r].rgbtRed * s;
                        gygreen += copy[y + s][x + r].rgbtGreen * s;
                        gyblue += copy[y + s][x + r].rgbtBlue * s;
                    }
                    if (s == 0)
                    {
                        gyred += copy[y + s][x + r].rgbtRed * (s * 2);
                        gygreen += copy[y + s][x + r].rgbtGreen * (s * 2);
                        gyblue += copy[y + s][x + r].rgbtBlue * (s * 2);
                    }
                }
            }
        }
        int red = round(sqrt((gxred * gxred) + (gyred * gyred)));
        int green = round(sqrt((gxgreen * gxgreen) + (gygreen * gygreen)));
        int blue = round(sqrt((gxblue * gxblue) + (gyblue * gyblue)));

        if (red > 255)
        {
            red = 255;
        }
        if (blue > 255)
        {
            blue = 255;
        }
        if (green > 255)
        {
            green = 255;
        }

        image[y][x].rgbtRed = red;
        image[y][x].rgbtGreen = green;
        image[y][x].rgbtBlue = blue;

    }
}
return;
}

这是我的错误:

:( 边缘正确过滤中间像素 预期为“210 150 60\n”,而不是“199 150 60\n”

:( 边缘正确过滤边缘上的像素 预期为“213 228 255\n”,而不是“191 198 255\n”

:( 边缘正确过滤角落中的像素 预期为“76 117 255\n”,而不是“58 92 248\n”

:( 边缘正确过滤 3x3 图像 预期为“76 117 255\n21...”,而不是“58 92 248\n191...”

:( 边缘正确过滤 4x4 图像 预期为“76 117 255\n21...”,而不是“58 92 248\n191...”

【问题讨论】:

  • 你能分享一下这段代码应该做什么吗?检测边缘?

标签: c filter cs50


【解决方案1】:

R、G 和 B 的 gx、gy 可能会通过 if 的运行而改变。

测试:您可能希望在“将值传回图像”循环之前打印出它们的值

【讨论】:

    【解决方案2】:

    如果问题仍然存在:

    评论会很有帮助.. 可能还有一个用于计算的浮点数。我不知道 sqrt 是自动转换它的结果还是你得到一个 sqrt-int。

    目前我自己在做,所以我会在尝试时看看我的工作原理。

    【讨论】:

      【解决方案3】:

      我刚刚通过了 check50 并提交了我的代码。我猜您收到的错误消息表明您的“if”条件中存在一些逻辑缺陷,这些缺陷不能很好地处理边缘和角落像素。昨天我花了几个小时试图弄清楚如何处理那些棱角,但没有成功,那真的很痛苦。然后突然想到一个绝妙的主意:在制作原图的副本时,还可以在副本中添加四个黑边,这样在复制的图像中,原图就在中间,四周是四个黑边。然后您只需要处理中间像素,不再需要处理边缘或角落像素。有了这个想法,编写代码就是小菜一碟。如果你需要,我可以在这里发布我的代码。

      【讨论】:

        猜你喜欢
        • 2021-02-01
        • 2021-12-15
        • 2020-11-13
        • 2020-09-25
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多