【问题标题】:(PSET4 Filter "grayscale") What exactly is check50 saying is wrong about my code?(PSET4 过滤器“灰度”) check50 到底说我的代码有什么问题?
【发布时间】:2021-06-22 02:41:24
【问题描述】:

我的任务是编写一个对给定图像应用灰度滤镜的程序。这是通过循环每个像素并平均 rgb 值来完成的。当我检查我的代码时,我收到一个错误,似乎是“错误:预期 X,收到 X”。感谢您对错误消息或有关可能错误的 cmet 的任何澄清。

我的代码循环遍历像素数组的每一行中的每个像素,这些像素数组被描述为RGBTRIPLES,结构由 3 个uint8_t 组成。在非整数平均值的情况下,程序将向上四舍五入到最接近的整数。我的答案是下面包含的代码。

当我运行check50 cs50/problems/2021/x/filter/more 时,我的问题就出现了,这是一个根据课程设计者制作的密钥测试学生程序的程序。第 7 次测试检查程序过滤“复杂”3x3 图像的准确性;我得到以下结果:

:( grayscale correctly filters more complex 3x3 image
    expected "20 20 20\n50 5...", not "20 20 20\n50 5..."

我很困惑,因为我的输出似乎与预期相符。谁能给我提示一下我的问题是什么?

我的代码:

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    //Loop over pixels
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {

            //Average out rgbs to get a corresponding greyscale value
            BYTE average_activation = ceil(((float) image[y][x].rgbtBlue + image[y][x].rgbtRed + image[y][x].rgbtGreen) / 3);
            RGBTRIPLE resultant_pixel = {average_activation, average_activation, average_activation};

            //apply
            image[y][x] = resultant_pixel;
        }
    }

    return;
}

【问题讨论】:

  • 预期/实际结果似乎已被... 截断。在那之后可能会有所不同。有没有办法让您查看整个预期输出?
  • 我不确定错误是什么,但是您是否有理由转换为浮点数来执行此操作?它可以更容易地完成(并且以较少计算要求的方式),如下所示:BYTE average_activation = (image[y][x].rgbtBlue + image[y][x].rgbtRed + image[y][x].rgbtGreen + 2) / 3; 加号两个处理四舍五入。

标签: c cs50


【解决方案1】:

我认为您应该使用 #include &lt;math.h&gt; 使用 round 而不是 ceil 使事情变得过于复杂。此外,您不应该为图像中的每个像素定义新像素。而是定义一个与旧图像具有相同宽度和高度的新图像,并替换该图像中的每个像素。最后用旧图像替换新图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-11
    • 2023-01-19
    • 1970-01-01
    • 2020-12-05
    • 2022-08-14
    • 2016-11-04
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多