Блок задач

4. Структуры данных

Темы
Сложность 4

Задача «Медианный фильтр»

Реализовать обработку изображения алгоритмом медианной фильтрации.

Входные данные

Текстовый файл, содержащий:

  • имя исходного BMP-файла
  • размер окрестности (сторона квадрата NxN пикселей)
  • порог фильтрации (от 0 до N2 / 2)
  • имя результирующего BMP-файла.

Пример файла:

kitty.bmp
3
2
kitty_filtered.bmp

Постановка Задачи

Написать программу, которая читает входной файл, открывает исходное изображение, осуществляет фильтрацию и выводит результат в выходной файл.

Передачу имени входного файла реализовать через аргументы командной строки.

Кратко об алгоритме

Рассмотрим изображение в градациях серого.

Изображение обрабатывается попиксельно. Для каждого пикселя выбирается окрестность (квадрат NxN). Например, рассмотрим некоторый пиксель с яркостью 150. Предположим, в его окрестности 3x3 оказались:

123 116 126
126 150 128
125 125 117

Отсортируем пиксели по яркости, найдём медиану, отметим положение центрального пикселя

116 117 123 125 125 126 126 128 150 
                 ^медиана        ^центральный пиксель

Отступим от медианы влево и вправо на порог фильтрации, сформируем допустимый диапазон яркости.

116 117 123 125 125 126 126 128 150 
         ^   диапазон    ^       ^центральный пиксель

Если центральный пиксель попадает в допустимый диапазон яркости, то его значение не меняется, в противном случае его яркость заменяется на медианное значение. В приведённом примере яркость центрального пикселя будет заменена на 125.

При работе с цветным изображением в формате RGB процедура фильтрации выполняется аналогичным образом отдельно для каждого цветового канала.

Для работы с форматом BMP использовать одну из header-only библиотек.

Выходные данные

BMP-файл, содержащий результирующее отфильтрованное изображение.

Тестирование

Необходимо написать полноценный набор тестов, в том числе для не валидных параметров заданных во входном файле.

Функции ввода/вывода нужно тестировать с помощью std::stringstream. Тестировать работу с изображениями нужно путем самостоятельной генерации изображений, без использования файлов.