Лёгкий и быстрый инструмент на C++17 для обработки BMP-изображений через командную строку.
Работает без сторонних зависимостей.
Входные и выходные графические файлы должны быть в формате BMP.
Формат BMP поддерживает достаточно много вариаций, но в этом проекте будет использоваться
24-битный BMP без сжатия и без таблицы цветов. Тип используемого DIB header - BITMAPINFOHEADER.
Пример файла в нужном формате есть в статье на Википедии в разделе "Example 1"
Пожалуйста обращайте внимание на то, чтобы тестовое изображение было сохранено именно в 24-битном BMP.
Описание формата аргументов командной строки:
{имя программы} {путь к входному файлу} {путь к выходному файлу} [-{имя фильтра 1} [параметр фильтра 1] [параметр фильтра 2] ...] [-{имя фильтра 2} [параметр фильтра 1] [параметр фильтра 2] ...] ...
При запуске без аргументов программа выводит справку.
Обрезает изображение до заданных ширины и высоты. Используется верхняя левая часть изображения.
Если запрошенные ширина или высота превышают размеры исходного изображения, выдается доступная часть изображения.
Преобразует изображение в оттенки серого по формуле
Преобразует изображение в негатив по формуле
Повышение резкости. Достигается применением матрицы
Выделение границ. Изображение переводится в оттенки серого и применяется матрица
Пиксели со значением, превысившим threshold, окрашиваются в белый, остальные – в черный.
Гауссово размытие, параметр – сигма.
Значение каждого из цветов пикселя C[x0][y0] определяется формулой
Существуют различные варианты релализации и оптимизации вычисления этого фильтра, описание есть в Википедии.
Пикселизация изображения
image_processor/
├── filters/ # Реализация всех фильтров
├── image/ # Класс Image и служебный код
├── parser/ # Парсинг CLI-аргументов
├── reading_and_writing/ # Чтение и запись BMP
├── test_script/ # Скрипты и JSON для интеграционных тестов
├── utils.h # Общие утилиты
├── CMakeLists.txt # Конфигурация сборки
├── image_processor # Исполняемый файл (конфигурация CLion)
├── unit_tests # Модульные тесты Catch2
└── README.md # Этот файл
git clone https://github.com/Nikkfh5/image_processor.git
cd image_processor
mkdir build && cd build
cmake ..
cmake --build ..
Перевод в оттенки серого ./image_processor photos/cat.bmp out/cat_gs.bmp -gs
Обрезка до 400×300 и размытие ./image_processor in.bmp out.bmp -crop 400 300 -blur 2.0
Пикселизация + негатив ./image_processor in.bmp out.bmp -pixelate 12 -neg
./image_processor input.bmp /tmp/output.bmp -crop 800 600 -gs -blur 0.5
В этом примере
- Загружается изображение из файла
input.bmp - Обрезается до изображения с началом в верхнем левом углу и размером 800х600 пикселей
- Переводится в оттенки серого
- Применяется размытие с сигмой 0.5
- Полученное изображение сохраняется в файл
/tmp/output.bmp
Список фильтров может быть пуст, тогда изображение сохраняется в неизменном виде. Фильтры применяются в том порядке, в котором они перечислены в аргументах командной строки.
В формулах далее считаем, что каждая компонента цвета
представлена вещественным числом от 0 до 1. Цвета пикселей
представлены тройками (R, G, B). Таким образом, (0, 0, 0) – черный,
(1, 1, 1) – белый.
Если фильтр задан матрицей, это означает, что значение каждого из цветов определяется взвешенной суммой значений этого цвета в соседних пикселях в соответствии с матрицей. При этом целевому пикселю соответствует центральный элемент матрицы.
Создан как учебный проект, но легко расширяется под более сложную обработку изображений.