Рамка-размытие изображения в C (CS50)

Я застрял на решении cs50 box-blur, которое является частью задачи filter (less) pset4. Когда я запускаю свою программу, ничего не выполняется ...

Инструкции следующие: Размытие

Есть несколько способов создать эффект размытия или смягчения изображения. Для этой проблемы мы будем использовать «размытие рамки», которое работает, беря каждый пиксель и для каждого значения цвета присваивая ему новое значение путем усреднения значений цвета соседних пикселей.

(Пример) Новое значение каждого пикселя будет средним из значений всех пикселей, которые находятся в пределах 1 строки и столбца исходного пикселя (образуя прямоугольник 3x3). Например, каждое из значений цвета для пикселя 6 может быть получено путем усреднения исходных значений цвета пикселей 1, 2, 3, 5, 6, 7, 9, 10 и 11 (обратите внимание, что сам пиксель 6 включен в в среднем). Аналогичным образом, значения цвета для пикселя 11 могут быть получены путем усреднения значений цвета пикселей 6, 7, 8, 10, 11, 12, 14, 15 и 16.

Для пикселя по краю или углу, например пикселя 15, мы все равно будем искать все пиксели в пределах 1 строки и столбца: в этом случае пиксели 10, 11, 12, 14, 15 и 16.

Мой код:

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE temp[height][width];
    int red = 0;
    int blue = 0;
    int green = 0;

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            int count = 0;
            int rowCoords[] = { row-1, row, row+1 };
            int colCoords[] = { col-1, col, col+1 };

            //3x3 square around pixel
            for (int r = 0; r < 3; r++)
            {
                for (int c = 0; c < 3; c++)
                {
                    int curR = rowCoords[r];
                    int curC = colCoords[c];

                    //check adjacents inside image
                    if (curR >= 0 && curR < height)
                    {
                        if (curC >= 0 && curC < width)
                        {
                            //total of all surrounding pixels
                            RGBTRIPLE pixel = image[curR][curC];
                            red = red + pixel.rgbtRed;
                            green = green + pixel.rgbtGreen;
                            blue = blue + pixel.rgbtBlue;
                            count++;

                        }
                    }

                }

                //average
                temp[row][col].rgbtRed = round(red / count);
                temp[row][col].rgbtGreen = round(green / count);
                temp[row][col].rgbtBlue = round(blue / count);
            }
        }
    }
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            //copy to original
            image[i][j] = temp[i][j];
        }
    }
    return;
}

person Nini    schedule 01.09.2020    source источник
comment
Мне непонятно, что именно делают вложенные for loops. Особенно 3-й и 4-й цикл for. Может быть, вы можете добавить еще немного комментариев к коду. И попытайтесь уточнить, что вы имеете в виду, говоря, что ничего не выполняется. Вы получаете ошибку? Вы запускаете тестовый файл?   -  person Enis Arik    schedule 01.09.2020
comment
@ earik87 См. исходную спецификацию на cs50.harvard.edu/ x / 2020 / psets / 4 / filter / less / # blur. Каждый пиксель необходимо размыть, используя значения окружающего прямоугольника 3x3.   -  person cyanic    schedule 02.09.2020
comment
@Nini Вы пробовали запустить check50 тест на эту проблему? Это должно гарантировать, что он будет запущен с правильными аргументами и вызовет вашу функцию.   -  person cyanic    schedule 02.09.2020


Ответы (1)


Код очень хороший. Я бы выразил некоторые вещи по-другому (например, я думаю, что if (X) if (Y) было бы яснее, чем if (X && Y), а дополнительный уровень косвенности через таблицу поиска вокруг индексов ящиков является ненужной обфускацией), но функционально это почти правильно. Единственная проблема, которую я вижу, заключается в том, что значения red, green и blue инициализируются значением 0 только один раз. Это должно происходить перед обработкой каждого пикселя. Так, например, вы можете поместить эти строки сюда:

for (int row = 0; row < height; row++)
{
    for (int col = 0; col < width; col++)
    {
        int count = 0;
        int red = 0;
        int blue = 0;
        int green = 0;
        ...

Тем не менее, эта ошибка должна приводить к странным цветовым значениям изображения. Это не должно иметь эффекта, который можно было бы описать, как будто ничего не выполняется. Таким образом, вполне вероятно, что ваша функция blur() функция вообще никогда не вызывается. Можете ли вы поставить точку останова в верхней части этой функции, чтобы убедиться, что она действительно вызывается? Или вы хотите опубликовать свою main() функцию?

person Howlium    schedule 03.09.2020