我的任务是编写一个程序,将灰度过滤器应用于给定的图像。这是通过循环每个像素并平均 rgb 值来完成的。当我检查我的代码时,我收到一条错误消息,似乎在说“错误:预期 X,收到 X”。感谢您对错误消息的任何澄清或对可能的错误的评论。
我的代码循环遍历被描述为 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;
}
答案 0 :(得分:0)
我认为您应该使用 round 而不是 ceil 使用 #include <math.h>
使事情变得过于复杂。此外,您不应为图像中的每个像素定义新像素。而是定义一个与旧图像具有相同宽度和高度的新图像,并替换该图像中的每个像素。最后用旧图像替换新图像。