Функция размытия CS50 pset4 - проблема с выяснением причины неудачи тестов на изображениях 3х3 и 4х4 - PullRequest
0 голосов
/ 21 апреля 2020

Я работал над кодом для функции размытия CS50 pset4. Предполагается, что эта функция рассчитывает средние значения RGB для всех соседних пикселей, а затем применяет его к «среднему» пикселю (так как пиксель может быть расположен по углам, краям или в любом месте в середине)

Я не получаю ошибок при компиляции или запуске кода. все выходные изображения выглядят размытыми, но когда я запускаю код для check50, он не проходит два теста:

:( blur correctly filters 3x3 image
    expected "70 85 95\n80 9...", not "70 85 95\n80 9..."
:( blur correctly filters 4x4 image
    expected "70 85 95\n80 9...", not "70 85 95\n80 9..."

Остальные тесты проходят (тестирование пикселя по краю, в углу и в середине), поэтому я мне трудно понять, что я делаю неправильно.

Вот мой код:

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    // creating a blank copy
    RGBTRIPLE blured[height][width];

    // upper left corner (anchored)
    for (int i = 0; i < 1; i++)
    {
        for (int j = 0; j < 1; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i; k <= i + 1; k++)
            {
                for (int l = j; l <= j + 1; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 4);
            blured[i][j].rgbtGreen = round(trackerGreen / 4);
            blured[i][j].rgbtBlue = round(trackerBlue / 4);
        }
    }
    // top middle row
    for (int i = 0; i < 1; i++)
    {
        for (int j = 1; j < width - 1; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i; k <= i + 1; k++)
            {
                for (int l = j - 1; l <= j + 1; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 6);
            blured[i][j].rgbtGreen = round(trackerGreen / 6);
            blured[i][j].rgbtBlue = round(trackerBlue / 6);
        }
    }
    // upper right corner (anchored)
    for (int i = 0; i < 1; i++)
    {
        for (int j = width - 1; j < width; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i; k <= i + 1; k++)
            {
                for (int l = j - 1; l <= j; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 4);
            blured[i][j].rgbtGreen = round(trackerGreen / 4);
            blured[i][j].rgbtBlue = round(trackerBlue / 4);
        }
    }
    // left middle column
    for (int i = 1; i < height - 1; i++)
    {
        for (int j = 0; j < 1; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i - 1; k <= i + 1; k++)
            {
                for (int l = j; l <= j + 1; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 6);
            blured[i][j].rgbtGreen = round(trackerGreen / 6);
            blured[i][j].rgbtBlue = round(trackerBlue / 6);
        }
    }
    // center
    for (int i = 1; i < height - 1; i++)
    {
        for (int j = 1; j < width - 1; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i - 1; k <= i + 1; k++)
            {
                for (int l = j - 1; l <= j + 1; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 9);
            blured[i][j].rgbtGreen = round(trackerGreen / 9);
            blured[i][j].rgbtBlue = round(trackerBlue / 9);
        }
    }
    // right middle column
    for (int i = 1; i < height - 1; i++)
    {
        for (int j = width - 1; j < width; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i - 1; k <= i + 1; k++)
            {
                for (int l = j; l <= j; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 6);
            blured[i][j].rgbtGreen = round(trackerGreen / 6);
            blured[i][j].rgbtBlue = round(trackerBlue / 6);
        }
    }
    // lower left corner (anchored)
    for (int i = height - 1; i < height; i++)
    {
        for (int j = 0; j < height; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i - 1; k <= i; k++)
            {
                for (int l = j; l <= j + 1; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 4);
            blured[i][j].rgbtGreen = round(trackerGreen / 4);
            blured[i][j].rgbtBlue = round(trackerBlue / 4);
        }
    }
    // bottom middle row
    for (int i = height - 1; i < height; i++)
    {
        for (int j = 1; j < width - 1; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i - 1; k <= i; k++)
            {
                for (int l = j - 1; l <= j + 1; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 6);
            blured[i][j].rgbtGreen = round(trackerGreen / 6);
            blured[i][j].rgbtBlue = round(trackerBlue / 6);
        }
    }
    // lower right corner (anchored)
    for (int i = height - 1; i < height; i++)
    {
        for (int j = width - 1; j < width; j++)
        {
            float trackerRed = 0, trackerGreen = 0, trackerBlue = 0;
            for (int k = i - 1; k <= i; k++)
            {
                for (int l = j - 1; l <= j; l++)
                {
                    trackerRed += (float)image[k][l].rgbtRed;
                    trackerGreen += (float)image[k][l].rgbtGreen;
                    trackerBlue += (float)image[k][l].rgbtBlue;
                }
            }
            blured[i][j].rgbtRed = round(trackerRed / 4);
            blured[i][j].rgbtGreen = round(trackerGreen / 4);
            blured[i][j].rgbtBlue = round(trackerBlue / 4);
        }
    }

    // copy blured image data back to the original image
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            image[i][j].rgbtRed = blured[i][j].rgbtRed;
            image[i][j].rgbtGreen = blured[i][j].rgbtGreen;
            image[i][j].rgbtBlue = blured[i][j].rgbtBlue;
        }
    }
    return;
}

Любая помощь очень ценится

1 Ответ

0 голосов
/ 05 мая 2020

Я тоже в классе, так что это может быть совершенно неправильно, но вот что я видел:

// right middle column
for (int l = j; l <= j; l++)

Ваш для l oop для int не кажется правильным. Разве не должно быть 2 столбца?

// lower left corner (anchored)
for (int j = 0; j < height; j++)

j должно быть шириной, но так как это угол, основанный на вашем предыдущем коде, я думаю, что это должно быть 1

...