Обработка изображений в 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, что делает изображение темнее (в данном случае на одну треть, если оно имеет постоянные значения цвета).