Обработка изображений в C ++: равномерная операция сглаживания делает изображение темнее - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь уменьшить шум на изображении, создавая двумерный алгоритм равномерного сглаживания в 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 Ответ

0 голосов
/ 23 февраля 2019

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

вы пропускаете последний пиксель в каждом измерении.это с помощью <= вместо < в обоих ваших циклах for.


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

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

...