CS50模糊功能即使图像模糊也无法通过check50 [英] CS50 blur function does not pass check50, even though image is being blurred

查看:109
本文介绍了CS50模糊功能即使图像模糊也无法通过check50的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆