Обработка изображений в C++: равномерная операция сглаживания делает изображение темнее

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

Однако всякий раз, когда я запускаю код, пиксели в новом изображении становятся темнее (значение пикселя 255= белый, а 0= черный). Вот функция для получения нового значения пикселя:

int utility::windowAverage (image &src, int x, int y, int window_size)
{
    int sum = 0;
    int avg;
    for(int i = x-(window_size/2); i < x+(window_size/2);++i)
    {
        for(int j = y-(window_size/2); j < y+(window_size/2);++j)
        {
            sum += src.getPixel(i,j);
        }
    }

    avg = sum/(window_size*window_size);
    return avg;
}

Параметр image &src является исходным изображением, а функция src.getPixel(i,j) возвращает целое число от 0 до 255, представляющее яркость пикселя в указанных координатах (i,j).

Я запускаю код над изображениями уровня серого в формате.pgm.

Как я могу сгладить изображение при сохранении той же яркости?

1 ответ

Решение

Проблема в том, что вы на самом деле не добавляете пиксели в окно с размером windows_size * windows_size, но при вычислении вы пропускаете последний пиксель в каждом измерении sum,

Вы можете исправить это с помощью <=вместо <в обоих ваших петлях.


Пример того, что идет не так для window_size = 3 а также x=0 а также y=0:

Целочисленное деление на 2 в ваших циклах for является пробелом, что означает, что ваши циклы станут for (int i=-1; i < 1; i++), Это, очевидно, только зацикливается на (два) пикселя -1 и 0 в заданном направлении, но вы все равно делите на полное window_size 3, что делает изображение темнее (в данном случае на одну треть, если оно имеет постоянные значения цвета).

Другие вопросы по тегам