我正在处理 CS50 问题集,其中我需要做一个box blur对于图像的每个像素。虽然我的代码有点多余,因为我为像素的特殊情况(如边缘和角)创建了 8 个 if 语句,但它按预期模糊了图像,所以我不太确定如何解决该问题。这是错误代码:
:( blur correctly filters middle pixel
expected "127 140 149\n", not "145 160 169\n"
:( blur correctly filters pixel on edge
expected "80 95 105\n", not "90 106 116\n"
:) blur correctly filters pixel in corner
:( blur correctly filters 3x3 image
expected "70 85 95\n80 9...", not "70 85 95\n90 1..."
:( blur correctly filters 4x4 image
expected "70 85 95\n80 9...", not "70 85 95\n90 1..."
还有更详细的错误代码here(只看“模糊”错误)
下面是我的代码:
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
int blue;
int green;
int red;
int counter = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (i == 0 && j == 0)
{
// top left corner
blue = (image[i][j].rgbtBlue + image[i + 1][j].rgbtBlue + image[i][j+1].rgbtBlue + image[i + 1][j+1].rgbtBlue);
green = (image[i][j].rgbtGreen + image[i + 1][j].rgbtGreen + image[i][j+1].rgbtGreen + image[i + 1][j+1].rgbtGreen);
red = (image[i][j].rgbtRed + image[i + 1][j].rgbtRed + image[i][j+1].rgbtRed + image[i + 1][j+1].rgbtRed);
counter = 4;
}
else if (i == 0 && j == (width - 1))
{
// top right corner
blue = (image[i][j].rgbtBlue + image[i + 1][j].rgbtBlue + image[i][j-1].rgbtBlue + image[i + 1][j-1].rgbtBlue);
green = (image[i][j].rgbtGreen + image[i + 1][j].rgbtGreen + image[i][j-1].rgbtGreen + image[i + 1][j-1].rgbtGreen);
red = (image[i][j].rgbtRed + image[i + 1][j].rgbtRed + image[i][j-1].rgbtRed + image[i + 1][j-1].rgbtRed);
counter = 4;
}
else if (i == 0 && (j != 0 || j != (width - 1)))
{
// top edge
blue = (image[i][j - 1].rgbtBlue + image[i][j].rgbtBlue + image[i][j + 1].rgbtBlue + image[i + 1][j].rgbtBlue + image[i+1][j - 1].rgbtBlue + image[i + 1][j + 1].rgbtBlue);
green = (image[i][j - 1].rgbtGreen + image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen + image[i + 1][j].rgbtGreen + image[i+1][j - 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen);
red = (image[i][j - 1].rgbtRed + image[i][j].rgbtRed + image[i][j + 1].rgbtRed + image[i + 1][j].rgbtRed + image[i+1][j - 1].rgbtRed + image[i + 1][j + 1].rgbtRed);
counter = 6;
}
else if (i == (height - 1) && j == 0)
{
// bottom left corner
blue = (image[i-1][j + 1].rgbtBlue + image[i][j + 1].rgbtBlue + image[i - 1][j].rgbtBlue + image[i][j].rgbtBlue);
green = (image[i-1][j + 1].rgbtGreen + image[i][j + 1].rgbtGreen + image[i - 1][j].rgbtGreen + image[i][j].rgbtGreen);
red = (image[i-1][j + 1].rgbtRed + image[i][j + 1].rgbtRed + image[i - 1][j].rgbtRed + image[i][j].rgbtRed);
counter = 4;
}
else if (i == (height - 1) && j == (width - 1))
{
// bottom right corner
blue = (image[i][j].rgbtBlue + image[i - 1][j].rgbtBlue + image[i][j-1].rgbtBlue + image[i - 1][j-1].rgbtBlue);
green = (image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i][j-1].rgbtGreen + image[i - 1][j-1].rgbtGreen);
red = (image[i][j].rgbtRed + image[i - 1][j].rgbtRed + image[i][j-1].rgbtRed + image[i - 1][j-1].rgbtRed);
counter = 4;
}
else if (i == (height - 1) && (j != 0 || j != (width - 1)))
{
// bottom edge
blue = (image[i][j].rgbtBlue + image[i][j - 1].rgbtBlue + image[i][j + 1].rgbtBlue + image[i - 1][j].rgbtBlue + image[i-1][j - 1].rgbtBlue + image[i - 1][j + 1].rgbtBlue);
green = (image[i][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i][j + 1].rgbtGreen + image[i - 1][j].rgbtGreen + image[i-1][j - 1].rgbtGreen + image[i - 1][j + 1].rgbtGreen);
red = (image[i][j].rgbtRed + image[i][j - 1].rgbtRed + image[i][j + 1].rgbtRed + image[i - 1][j].rgbtRed + image[i-1][j - 1].rgbtRed + image[i - 1][j + 1].rgbtRed);
counter = 6;
}
else if (j == 0 && (i != 0 || i != (height - 1)))
{
// left edge
blue = (image[i][j].rgbtBlue + image[i - 1][j].rgbtBlue + image[i+1][j].rgbtBlue + image[i][j + 1].rgbtBlue + image[i-1][j + 1].rgbtBlue + image[i + 1][j + 1].rgbtBlue);
green = (image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i+1][j].rgbtGreen + image[i][j + 1].rgbtGreen + image[i-1][j + 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen);
red = (image[i][j].rgbtRed + image[i - 1][j].rgbtRed + image[i+1][j].rgbtRed + image[i][j + 1].rgbtRed + image[i-1][j + 1].rgbtRed + image[i + 1][j + 1].rgbtRed);
counter = 6;
}
else if (j == (width - 1) && (i != 0 || i != (height - 1)))
{
// right edge
blue = (image[i][j].rgbtBlue + image[i-1][j].rgbtBlue + image[i + 1][j].rgbtBlue + image[i][j - 1].rgbtBlue + image[i + 1][j-1].rgbtBlue + image[i-1][j - 1].rgbtBlue);
green = (image[i][j].rgbtGreen + image[i-1][j].rgbtGreen + image[i + 1][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i + 1][j-1].rgbtGreen + image[i-1][j - 1].rgbtGreen);
red = (image[i][j].rgbtRed + image[i-1][j].rgbtRed + image[i + 1][j].rgbtRed + image[i][j - 1].rgbtRed + image[i + 1][j-1].rgbtRed + image[i-1][j - 1].rgbtRed);
counter = 6;
}
else
{
blue = (image[i][j].rgbtBlue + image[i - 1][j].rgbtBlue + image[i + 1][j].rgbtBlue + image[i][j - 1].rgbtBlue + image[i][j + 1].rgbtBlue + image[i - 1][j + 1].rgbtBlue + image[i-1][j - 1].rgbtBlue + image[i + 1][j - 1].rgbtBlue + image[i + 1][j + 1].rgbtBlue);
green = (image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i + 1][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i][j + 1].rgbtGreen + image[i - 1][j + 1].rgbtGreen + image[i-1][j - 1].rgbtGreen + image[i + 1][j - 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen);
red = (image[i][j].rgbtRed + image[i - 1][j].rgbtRed + image[i + 1][j].rgbtRed + image[i][j - 1].rgbtRed + image[i][j + 1].rgbtRed + image[i - 1][j + 1].rgbtRed + image[i-1][j - 1].rgbtRed + image[i + 1][j - 1].rgbtRed + image[i + 1][j + 1].rgbtRed);
counter = 9;
}
image[i][j].rgbtBlue = round((float) blue / counter);
image[i][j].rgbtGreen = round((float) green / counter);
image[i][j].rgbtRed = round((float) red / counter);
}
}
return;
}
看看其他人对同样问题的答案,我发现有些人做了第二个嵌套for
循环存储像素的原始值。我最初尝试实现这个,但最终导致了问题,所以我认为没有必要。这是我的代码的问题吗?如果是,我将如何在代码中正确实现“原始值”像素?如果没有,有人知道问题所在吗?提前致谢。
您正在修改您的image
当您将模糊功能应用于像素时。这意味着当您修改几个像素时,相邻像素的模糊值将使用“模糊像素值”计算。这是错误的。所有计算必须在原始图像像素值内完成。为此,您应该创建一个副本image
一开始(例如temp
)并在其中进行所有这些计算temp
具有未修改像素值的图像。
将其添加到代码的开头;
RGBTRIPLE temp[height][width]; // create a temporary array to store a duplicate of image.
// save a new copy of image as temp per color.
for (int i = 0; i < height; i++) //Loop for height of image.
{
for (int j = 0; j < width; j++) //Loop for width of image and save color values in temp.
{
temp[i][j] = image[i][j];
}
}
并更换image
with temp
在你的计算中(除了最后的作业)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)