CS50 Filter(less)模糊功能
CS50 Filter(less) blur function
我对 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;
}
您正在 k
的内部 for
循环中定义 avgGreen
、avgBlue
和 avgRed
并归零。您需要在该循环之外执行此操作,但在 j
.
的循环中
有一个浮点计数器很奇怪。我建议使用 int。但请注意,在进行除法时,您仍然希望转换为浮动;否则 round
函数将无效(因为除法的结果将始终被截断)。
最后,你提到了avgred
、avgblue
、avggreen
,但这些都没有定义。 (检查大小写。)
将 RGB 值分配给 image[i][j]
的三行代码位于 h
的 for 循环内。他们需要在那个循环之外。它们乍一看似乎在该循环之外,因为它们缩进不正确。这些行下面的 }
需要在它们上面。
进行这些更改后,您的结果在功能上应该是正确的,但处理速度会很慢。如果您关心性能,则应避免在内部循环中进行比较。比较操作会破坏 CPU 的管道,这可能会非常慢。您的内循环中最多有四个比较。最好在两个内部循环之外进行这些比较,而不是在避免 [=56] 的基础上找到 hMin
、hMax
、iMin
和 iMax
=] 在像素缓冲区之外。然后你可以从 hMin
循环 h
到 hMax
并从 iMin
循环 i
到 iMax
,以获得更快的速度。
我对 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;
}
您正在
的循环中k
的内部for
循环中定义avgGreen
、avgBlue
和avgRed
并归零。您需要在该循环之外执行此操作,但在j
.有一个浮点计数器很奇怪。我建议使用 int。但请注意,在进行除法时,您仍然希望转换为浮动;否则
round
函数将无效(因为除法的结果将始终被截断)。最后,你提到了
avgred
、avgblue
、avggreen
,但这些都没有定义。 (检查大小写。)将 RGB 值分配给
image[i][j]
的三行代码位于h
的 for 循环内。他们需要在那个循环之外。它们乍一看似乎在该循环之外,因为它们缩进不正确。这些行下面的}
需要在它们上面。进行这些更改后,您的结果在功能上应该是正确的,但处理速度会很慢。如果您关心性能,则应避免在内部循环中进行比较。比较操作会破坏 CPU 的管道,这可能会非常慢。您的内循环中最多有四个比较。最好在两个内部循环之外进行这些比较,而不是在避免 [=56] 的基础上找到
hMin
、hMax
、iMin
和iMax
=] 在像素缓冲区之外。然后你可以从hMin
循环h
到hMax
并从iMin
循环i
到iMax
,以获得更快的速度。