CS50 pset4 中的模糊功能无法完全发挥作用
Blur function in CS50 pset4 not fully working
我花了两天时间尝试修正模糊给定图像的函数,但尽管进行了大量校对,它现在只适用于极端情况。对于其余部分,它会在 RGB 值中产生 2-20+ 的差异。
该任务是哈佛 CS50 课程的一部分(有关 pset4 https://cs50.harvard.edu/x/2020/psets/4/filter/less/ 的更多信息)。
我已经阅读了我能在网上找到的所有内容,并尝试使用这些技巧,例如将新的 RGB 值除以浮点数,将结果直接复制回原始图像,调整 if 条件,但这没有帮助,我仍然不知道出了什么问题。非常感谢帮助,谢谢!
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
float new_red, new_blue, new_green;
new_red = new_blue = new_green = 0;
int count = 0;
// Copy the image
RGBTRIPLE temp[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
temp[i][j] = image[i][j];
}
}
// Loop through height
for (int i = 0; i < height; i++)
{
// Loop through width
for (int j = 0; j < width; j++)
{
// Loop through rows around a pixel
for (int k = -1; k <= 1; k++)
{
// Loop through columns around a pixel
for (int m = -1; m <= 1; m++)
{
if (i + k >= 0 && i + k < height && j + m >= 0 && j + m < width)
{
count++;
new_red += temp[i + k][j + m].rgbtRed;
new_blue += temp[i + k][j + m].rgbtBlue;
new_green += temp[i + k][j + m].rgbtGreen;
}
}
}
temp[i][j].rgbtBlue = round(new_blue / count);
temp[i][j].rgbtRed = round(new_red / count);
temp[i][j].rgbtGreen = round(new_green / count);
}
}
// Copy the blurred image to original file
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j] = temp[i][j];
}
}
return;
}
我假设您需要为每个像素重置计数 new_blue、new_red 和 new_green。在您的代码中,这些值会随着您处理图像而不断增长。
// Loop through height
for (int i = 0; i < height; i++)
{
// Loop through width
for (int j = 0; j < width; j++)
{
count = new_blue = new_red = new_green = 0;
您在调试时可能发现这一点的一种方法是在进行除法和赋值之前为每个像素打印出这些变量的值。您可能已经注意到计数值太高了。
我认为另一个问题是您对临时图像中的像素进行了模糊处理。当你模糊一个像素时,你将使用它上面像素的已经模糊的值。相反,您可能想在最内层循环中使用原始图像:
new_red += image[i + k][j + m].rgbtRed;
new_blue += image[i + k][j + m].rgbtBlue;
new_green += image[i + k][j + m].rgbtGreen
我花了两天时间尝试修正模糊给定图像的函数,但尽管进行了大量校对,它现在只适用于极端情况。对于其余部分,它会在 RGB 值中产生 2-20+ 的差异。
该任务是哈佛 CS50 课程的一部分(有关 pset4 https://cs50.harvard.edu/x/2020/psets/4/filter/less/ 的更多信息)。
我已经阅读了我能在网上找到的所有内容,并尝试使用这些技巧,例如将新的 RGB 值除以浮点数,将结果直接复制回原始图像,调整 if 条件,但这没有帮助,我仍然不知道出了什么问题。非常感谢帮助,谢谢!
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
float new_red, new_blue, new_green;
new_red = new_blue = new_green = 0;
int count = 0;
// Copy the image
RGBTRIPLE temp[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
temp[i][j] = image[i][j];
}
}
// Loop through height
for (int i = 0; i < height; i++)
{
// Loop through width
for (int j = 0; j < width; j++)
{
// Loop through rows around a pixel
for (int k = -1; k <= 1; k++)
{
// Loop through columns around a pixel
for (int m = -1; m <= 1; m++)
{
if (i + k >= 0 && i + k < height && j + m >= 0 && j + m < width)
{
count++;
new_red += temp[i + k][j + m].rgbtRed;
new_blue += temp[i + k][j + m].rgbtBlue;
new_green += temp[i + k][j + m].rgbtGreen;
}
}
}
temp[i][j].rgbtBlue = round(new_blue / count);
temp[i][j].rgbtRed = round(new_red / count);
temp[i][j].rgbtGreen = round(new_green / count);
}
}
// Copy the blurred image to original file
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j] = temp[i][j];
}
}
return;
}
我假设您需要为每个像素重置计数 new_blue、new_red 和 new_green。在您的代码中,这些值会随着您处理图像而不断增长。
// Loop through height
for (int i = 0; i < height; i++)
{
// Loop through width
for (int j = 0; j < width; j++)
{
count = new_blue = new_red = new_green = 0;
您在调试时可能发现这一点的一种方法是在进行除法和赋值之前为每个像素打印出这些变量的值。您可能已经注意到计数值太高了。
我认为另一个问题是您对临时图像中的像素进行了模糊处理。当你模糊一个像素时,你将使用它上面像素的已经模糊的值。相反,您可能想在最内层循环中使用原始图像:
new_red += image[i + k][j + m].rgbtRed;
new_blue += image[i + k][j + m].rgbtBlue;
new_green += image[i + k][j + m].rgbtGreen