CS50 - функция размытия фильтра pset4 просто считает вверх - PullRequest
0 голосов
/ 09 июля 2020

Я работаю над фильтром (меньше) в pset4, и у меня полностью проверены все остальные функции, но когда я запускаю check50, я получаю следующие ответы для размытия:

:( blur correctly filters middle pixel
    expected "127 140 149\n", not "120 140 150\n"
:( blur correctly filters pixel on edge
    expected "80 95 105\n", not "40 50 60\n"
:( blur correctly filters pixel in corner
    expected "70 85 95\n", not "10 20 30\n"
:( blur correctly filters 3x3 image
    expected "70 85 95\n80 9...", not "10 20 30\n40 5..."
:( blur correctly filters 4x4 image
    expected "70 85 95\n80 9...", not "10 20 30\n40 5..."

Это первое делает вид, будто я делаю какую-то ошибку округления (хотя и очень непоследовательную, округляя сначала di git вниз, а затем последнее di git вверх), но затем ошибки становятся более странными и странно для меня, когда изображения становятся больше, пока последний массив, который я генерирую:

10 20 30
40 50 60
70 80 90
100 110 120
110 130 140
120 140 150
130 150 160
140 160 170
195 204 213
205 214 223
225 234 243
245 254 253
50 28 90
0 0 0
255 255 255
85 85 85

Я не уверен, как я начал это делать, но мне это совсем не нравится. Может ли кто-нибудь дать мне совет относительно того, что я здесь делаю не так? Большое спасибо за ваше время. Код ниже:

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    // copy the image
    // figure out blur data from the original picture and apply to the copy
    RGBTRIPLE tempArray[height][width];
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            int validPixels = 0;
            // cycle through area around a pixel
            for (int blurRadiusX = -1; blurRadiusX > 1; blurRadiusX++)
            {
                for (int blurRadiusY = -1; blurRadiusY > 1; blurRadiusY++)
                {
                // check area around pixels to see if it's at a valid location
                    if ((i + blurRadiusX > 0) && (i + blurRadiusX < (height - 1)) && (j + blurRadiusY > 0) && (j + blurRadiusY < (width - 1)))
                    {
                        // an array adding all the values up, to be averaged out later
                        tempArray[i][j].rgbtRed = tempArray[i][j].rgbtRed + image[i + blurRadiusX][j + blurRadiusY].rgbtRed;
                        tempArray[i][j].rgbtGreen = tempArray[i][j].rgbtGreen + image[i + blurRadiusX][j + blurRadiusY].rgbtGreen;
                        tempArray[i][j].rgbtBlue = tempArray[i][j].rgbtBlue + image[i + blurRadiusX][j + blurRadiusY].rgbtBlue;
                        validPixels++;
                    }
                }
            // if there are enough bytes to add these correctly, add and then divide by valid pixels
            // this should be applied to the image after tempArray is fully populated
            image[i][j].rgbtRed = round(tempArray[i][j].rgbtRed / validPixels * 1.00);
            image[i][j].rgbtGreen = round(tempArray[i][j].rgbtGreen / validPixels * 1.00);
            image[i][j].rgbtBlue = round(tempArray[i][j].rgbtBlue / validPixels * 1.00);
            }
        }
    }
    return;
}

А вот страница CS50 о наборе задач: https://cs50.harvard.edu/x/2020/psets/4/filter/less/

1 Ответ

0 голосов
/ 09 июля 2020

Итак, у меня действительно была такая же проблема, если я правильно это читаю. По сути, проблема в том, что структура RGBTRIPLE не хранит три целых числа, она хранит три байта, по одному для каждого из трех цветов. Поэтому, когда вы добавляете числа, чтобы получить общее количество, превышающее 255, оно «сбрасывается» до 0. Вместо использования RGBTRIPLE в качестве временного значения я бы использовал три целых числа.

Например:

int red;
int green;
int blue;

Затем просто увеличивайте эти числа и вместо этого работайте с ними. Дайте мне знать, если это не поможет, и я посмотрю глубже, но похоже, что проблема в этом.

...