我花了两天的时间来纠正我对模糊给定图像的功能,但是尽管进行了广泛的校对,但现在它仅适用于极端情况。对于其余部分,它会在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;
}
答案 0 :(得分:2)
我假设您要重置每个像素的计数,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