Реализовать обработку изображения алгоритмом медианной фильтрации.
Текстовый файл, содержащий:
Пример файла:
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. Тестировать работу с изображениями нужно путем самостоятельной генерации изображений, без использования файлов.