Тесты на моей программе пограничного фильтра CS50 не проходят - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю над программой Edge для CS50. У меня было много проблем с этой программой, но я чувствую, что становлюсь ближе. Если бы кто-нибудь мог помочь мне с любыми идеями о том, что могло бы пойти не так, я был бы очень благодарен.

Вот мой код:

// Detect edges
void edges(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE copy[height][width];

for (int h = 0; h < height; h++)
{
    for (int w = 0; w < width; w++)
    {
        copy[h][w] = image[h][w];
    }
}

for (int y = 0; y < height; y++)
{
    for (int x = 0; x < width; x++)
    {
        int gxred = 0;
        int gxgreen = 0;
        int gxblue = 0;
        int gyred = 0;
        int gygreen = 0;
        int gyblue = 0;
        for (int r = -1; r < 2; r++)
        {
            for (int s = -1; s < 2; s++)
            {
                if ((y + r < height && y + r >= 0) && (x + s < width && x + s >= 0))
                {
                    if (r == -1 || r == 1)
                    {
                        gxred += copy[y + r][x + s].rgbtRed * s;
                        gxgreen += copy[y + r][x + s].rgbtGreen * s;
                        gxblue += copy[y + r][x + s].rgbtBlue * s;
                    }
                    if (r == 0)
                    {
                        gxred += copy[y + r][x + s].rgbtRed * (s * 2);
                        gxgreen += copy[y + r][x + s].rgbtGreen * (s * 2);
                        gxblue += copy[y + r][x + s].rgbtBlue * (s * 2);
                    }

                }
                if ((y + s < height && y + s >= 0) && (x + r < width && x + r >= 0))
                {
                    if (s == -1 || s == 1)
                    {
                        gyred += copy[y + s][x + r].rgbtRed * s;
                        gygreen += copy[y + s][x + r].rgbtGreen * s;
                        gyblue += copy[y + s][x + r].rgbtBlue * s;
                    }
                    if (s == 0)
                    {
                        gyred += copy[y + s][x + r].rgbtRed * (s * 2);
                        gygreen += copy[y + s][x + r].rgbtGreen * (s * 2);
                        gyblue += copy[y + s][x + r].rgbtBlue * (s * 2);
                    }
                }
            }
        }
        int red = round(sqrt((gxred * gxred) + (gyred * gyred)));
        int green = round(sqrt((gxgreen * gxgreen) + (gygreen * gygreen)));
        int blue = round(sqrt((gxblue * gxblue) + (gyblue * gyblue)));

        if (red > 255)
        {
            red = 255;
        }
        if (blue > 255)
        {
            blue = 255;
        }
        if (green > 255)
        {
            green = 255;
        }

        image[y][x].rgbtRed = red;
        image[y][x].rgbtGreen = green;
        image[y][x].rgbtBlue = blue;

    }
}
return;
}

Вот мои ошибки:

:( Края правильно фильтруют средний ожидаемый пиксель "210 150 60 \ n", а не "199 150 60 \ n"

:( Края правильно фильтруют пиксель по ожидаемому краю "213 228 255 \ n", не "191 198 255 \ n"

:( правильно корректирует края для пикселя в ожидаемом углу "76 117 255 \ n", а не "58 92 248 \ n"

:( правильно фильтрует края 3x3 ожидается изображение "76 117 255 \ n21 ...", а не "58 92 248 \ n191 ..."

:( Края правильно фильтруют изображение 4x4, ожидаемое "76 117 255 \ n21 ...", не "58 92 248 \ n191 ..."

1 Ответ

1 голос
/ 22 апреля 2020

gx, gy для R, G и B могут измениться при выполнении if.

ТЕСТ: Возможно, вы захотите распечатать их значение перед «передачей значения обратно в изображение». L oop

...