cs50 Pset4 проблема с размытием изображения - PullRequest
0 голосов
/ 18 февраля 2020

Я застрял в этой проблеме некоторое время, и я очень озадачен тем, почему мой код не компилируется, как это должно быть. Я должен усреднить значение цвета пикселя № 5 с окружающим его пикселем так, чтобы полученное изображение выглядело размытым. Вот мой код:

    // Blur image
    // 1 | 2 | 3
    // -   -   -
    // 4 | 5 | 6
    // -   -   -
    // 7 | 8 | 9
    //assuming i is 5
    void blur(int height, int width, RGBTRIPLE image[height][width])
    {
        RGBTRIPLE copy[height][width];
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < width; j++)
            {
                copy[i][j] = image[i][j];
            }
        }
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < width; j++)
            {
                int red = 0;
                int green = 0;
                int blue = 0;
                float counter = 0;

                // 5
                red += copy[i][j].rgbtRed;
                green += copy[i][j].rgbtGreen;
                blue += copy[i][j].rgbtBlue;
                counter++;

                //1
                if (i - 1 > -1 && j - 1 > -1)
                {
                    red += copy[i - 1][j].rgbtRed;
                    green += copy[i - 1][j].rgbtGreen;
                    blue += copy[i - 1][j].rgbtBlue;
                    counter++;
                }
                // 2
                if (i - 1 > -1)
                {
                    red += copy[i - 1][j].rgbtRed;
                    green += copy[i - 1][j].rgbtGreen;
                    blue += copy[i - 1][j].rgbtBlue;
                    counter++;
                }
                // 3
                if (i - 1 > -1 && j + 1 < height)
                {
                    red += copy[i - 1][j + 1].rgbtRed;
                    green += copy[i - 1][j + 1].rgbtGreen;
                    blue += copy[i - 1][j + 1].rgbtBlue;
                    counter++;
                }
                // 4
                if (j - 1 > -1)
                {
                    red += copy[i][j - 1].rgbtRed;
                    green += copy[i][j - 1].rgbtGreen;
                    blue += copy[i][j - 1].rgbtBlue;
                    counter++;
                }
                // 6
                if (j + 1 < width)
                {
                    red += copy[i][j + 1].rgbtRed;
                    green += copy[i][j + 1].rgbtGreen;
                    blue += copy[i][j + 1].rgbtBlue;
                    counter++;
                }
                // 7
                if (i + 1 < height && j - 1 > -1)
                {
                    red += copy[i + 1][j - 1].rgbtRed;
                    green += copy[i + 1][j - 1].rgbtGreen;
                    blue += copy[i + 1][j - 1].rgbtBlue;
                    counter++;
                }
                // 8
                if (i + 1 < height)
                {
                    red += copy[i + 1][j].rgbtRed;
                    green += copy[i + 1][j].rgbtGreen;
                    blue += copy[i + 1][j].rgbtBlue;
                    counter++;
                }
                // 9
                if (i + 1 < height && j + 1 < width)
                {
                    red += copy[i + 1][j + 1].rgbtRed;
                    green += copy[i + 1][j + 1].rgbtGreen;
                    blue += copy[i + 1][j + 1].rgbtBlue;
                    counter++;
                }

                image[i][j].rgbtRed = round(red/counter);
                image[i][j].rgbtGreen = round(green/counter);
                image[i][j].rgbtBlue = round(blue/counter);
            }
        }
        return;
    }

Я проверяю начало с центрального пикселя и проверяю наличие окружающих пикселей и усредняю ​​значение центрального пикселя, используя значения его окружающих пикселей соответственно. Мой код компилируется нормально, и, кажется, он работает, когда я его запускаю. Когда я пытаюсь запустить debug50; все значения складываются, когда я проводил ручное тестирование. Однако, когда я попытался реализовать Check50, это сообщение об ошибке показывает

expected "127 140 149\n", not "130 143 153\n"
Log
testing with sample 3x3 image
first row: (10, 20, 30), (40, 50, 60), (70, 80, 90)
second row: (110, 130, 140), (120, 140, 150), (130, 150, 160)
third row: (200, 210, 220), (220, 230, 240), (240, 250, 255)
running ./testing 3 0...
checking for output "127 140 149\n"...

Expected Output:
127 140 149
Actual Output:
130 143 153

Не слишком уверен, что пошло не так с моим кодом. Любой совет будет высоко ценится!

1 Ответ

0 голосов
/ 20 февраля 2020
                //1
                if (i - 1 > -1 && j - 1 > -1)
                {
                    red += copy[i - 1][j].rgbtRed;
                    green += copy[i - 1][j].rgbtGreen;
                    blue += copy[i - 1][j].rgbtBlue;
                    counter++;
                }

Вы использовали 'j', тогда как вместо этого должно было быть 'j - 1'. Должно быть так:

                //1
                if (i - 1 > -1 && j - 1 > -1)
                {
                    red += copy[i - 1][j - 1].rgbtRed;
                    green += copy[i - 1][j - 1].rgbtGreen;
                    blue += copy[i - 1][j - 1].rgbtBlue;
                    counter++;
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...