CS50模糊功能即使图像模糊也无法通过check50 [英] CS50 blur function does not pass check50, even though image is being blurred
问题描述
我正在处理CS50问题集,需要在其中进行框模糊对于图像的每个像素.尽管我的代码有点多余,但是我为像素的特殊情况(如边和角)创建了8条if语句,但它却使图像模糊了,因此我不确定如何解决该问题.这是错误代码:
I am working on a CS50 problem set in which I need to do a box blur for each pixel of an image. Though my code is a bit redundant, as I had created 8 if statements for special cases of pixels (like edges and corners), it blurs the image as expected, so I'm not really sure how to fix the problem. Here's the error code:
:( 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..."
还有更详细的错误代码此处(仅查看模糊"错误)
There's also a more detailed error code here (only look at the "blur" errors)
下面是我的代码:
// 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
循环来存储像素的原始值.我最初尝试实现它,但是最终导致了问题,因此我认为这是没有必要的.这是我的代码的问题吗?如果是,我将如何正确实现原始值"?我的代码中的像素?如果没有,有人知道这个问题吗?预先感谢.
Looking at other people's answers for this same problem, I see that some have made a second nested for
loop to store the original value of the pixel. I initially tried to implement this, but it ended up causing problems, so I figured it was not necessary. Is this the problem with my code, and if so, how would I properly implement the "original value" pixel within my code? If not, does anyone know the problem? Thanks in advance.
推荐答案
在将模糊功能应用于像素时,您正在修改image
.这意味着当您修改几个像素时,相邻的像素模糊值将使用模糊的像素值"来计算.这是错误的.所有计算必须在原始图像像素值内完成.为此,您应该在开头创建image
的副本(例如temp
),并在具有不变像素值的temp
图像内进行所有计算.
You are modifying your image
as you apply blur function to the pixels. This means when you modify few pixels, the adjacent pixels blur values are calculated with "blurred pixel values". This is wrong. All the calculations must be done within original image pixel values. For this, you should create a copy of image
in the beginning (such as temp
) and make all this calculation within that temp
image which has unmodified pixel values.
将此添加到代码的开头;
Add this to the beginning of your code;
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
替换为temp
(末尾的赋值除外).
And replace image
with temp
in your calculations (except the assignment at the end).
这篇关于CS50模糊功能即使图像模糊也无法通过check50的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!