我是CS的新手,以为我会向社区求助。现在,我在滤镜(较少)pset的模糊功能上停留了6个多小时,并尝试了许多变体和适应性,但似乎没有一项通过check50。
我真的很感谢任何见解或建议(越详细越好)!
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;
}
答案 0 :(得分:0)
您正在avgGreen
的内部avgBlue
循环内定义avgRed
,for
和k
并将其清零。您需要在循环之外,但在j
上循环。
有一个浮动计数器是很奇怪的。我建议使用整数。但是请注意,您仍然希望在进行分割的位置时强制浮起;否则round
函数将无效(因为除法的结果将始终被截断)。
最后,您引用了avgred
,avgblue
和avggreen
,但它们是未定义的。 (检查大写。)
将RGB值分配给image[i][j]
的三行位于h
上的for循环内。他们需要在那个循环之外。它们一眼就看在该循环之外,因为它们缩进不正确。这些行下方的}
必须位于它们上方。
进行了这些更改之后,您的结果在功能上应该是正确的,但处理速度会很慢。如果您关心性能,则应避免在内部循环中进行比较。比较操作中断了CPU的流水线,这可能非常慢。您的内部循环中最多有四个比较。最好在两个内部循环之外进行比较,而不要基于避免在外部循环中运行而找到hMin
,hMax
,iMin
和iMax
。像素缓冲区。然后,您可以将h
从hMin
循环到hMax
,并将i
从iMin
循环到iMax
,以获得更快的速度。