我对 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;
}
您在内部循环中定义和归零avgGreen
,avgBlue
和。您需要在该循环之外执行此操作,但需要在.avgRed
for
k
j
有一个浮动计数器很奇怪。我建议使用int。但是请注意,在进行除法时,您仍然希望强制转换为浮动;否则该round
函数将无效(因为除法的结果将始终被截断)。
最后,你是指avgred
,avgblue
,和avggreen
,但这些都是不确定的。(检查大小写。)
分配 RGB 值的三行image[i][j]
位于 for 循环内h
。他们需要在那个循环之外。它们乍一看似乎在该循环之外,因为它们缩进不正确。在}
下面这些行需要为高于它们。
进行这些更改后,您的结果在功能上应该是正确的,但处理速度会很慢。如果您关心性能,则应避免在内部循环中进行比较。比较操作会破坏 CPU 的管道,这会非常慢。您的内部循环中最多有四个比较。最好在两个内部循环之外进行这些比较,而是基于避免在像素缓冲区之外运行来找到hMin
, hMax
, iMin
, 和iMax
。然后您可以h
从hMin
tohMax
循环并从to循环i
,iMin
以iMax
获得更好的速度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句