Skip to content

Repository files navigation

🖼️ image_processor

Лёгкий и быстрый инструмент на C++17 для обработки BMP-изображений через командную строку.
Работает без сторонних зависимостей.


Поддерживаемый формат изображений

Входные и выходные графические файлы должны быть в формате BMP.

Формат BMP поддерживает достаточно много вариаций, но в этом проекте будет использоваться 24-битный BMP без сжатия и без таблицы цветов. Тип используемого DIB header - BITMAPINFOHEADER.

Пример файла в нужном формате есть в статье на Википедии в разделе "Example 1"

Пожалуйста обращайте внимание на то, чтобы тестовое изображение было сохранено именно в 24-битном BMP.

Формат аргументов командной строки

Описание формата аргументов командной строки:

{имя программы} {путь к входному файлу} {путь к выходному файлу} [-{имя фильтра 1} [параметр фильтра 1] [параметр фильтра 2] ...] [-{имя фильтра 2} [параметр фильтра 1] [параметр фильтра 2] ...] ...

При запуске без аргументов программа выводит справку.

Список базовых фильтров

Crop (-crop width height)

Обрезает изображение до заданных ширины и высоты. Используется верхняя левая часть изображения.

Если запрошенные ширина или высота превышают размеры исходного изображения, выдается доступная часть изображения.

Grayscale (-gs)

Преобразует изображение в оттенки серого по формуле

$$ R' = G' = B' = 0.299R + 0.587G + 0.114B $$

Negative (-neg)

Преобразует изображение в негатив по формуле

$$ R' = 1 - R, \quad G' = 1 - G, \quad B' = 1 - B $$

Sharpening (-sharp)

Повышение резкости. Достигается применением матрицы

$$ \begin{bmatrix} & -1 & \\ -1 & 5 & -1 \\ & -1 & \end{bmatrix} $$

Edge Detection (-edge threshold)

Выделение границ. Изображение переводится в оттенки серого и применяется матрица

$$ \begin{bmatrix} & -1 & \\ -1 & 4 & -1 \\ & -1 & \end{bmatrix} $$

Пиксели со значением, превысившим threshold, окрашиваются в белый, остальные – в черный.

Gaussian Blur (-blur sigma)

Гауссово размытие, параметр – сигма.

Значение каждого из цветов пикселя C[x0][y0] определяется формулой

$$ C[x_0][y_0] = \sum_{x=0,,y=0}^{width-1,,height-1} C[x][y] \frac{1}{2\pi\sigma^2} e^{-\frac{(x_0-x)^2 + (y_0-y)^2}{2\sigma^2}} $$

Существуют различные варианты релализации и оптимизации вычисления этого фильтра, описание есть в Википедии.

Pixelate (block_size)

Пикселизация изображения


🧩 Структура проекта

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

В этом примере

  1. Загружается изображение из файла input.bmp
  2. Обрезается до изображения с началом в верхнем левом углу и размером 800х600 пикселей
  3. Переводится в оттенки серого
  4. Применяется размытие с сигмой 0.5
  5. Полученное изображение сохраняется в файл /tmp/output.bmp

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

Фильтры

В формулах далее считаем, что каждая компонента цвета представлена вещественным числом от 0 до 1. Цвета пикселей представлены тройками (R, G, B). Таким образом, (0, 0, 0) – черный, (1, 1, 1) – белый.

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

Создан как учебный проект, но легко расширяется под более сложную обработку изображений.

About

Lightweight C++17 command-line tool for BMP image processing (crop, blur, sharpen, edge-detect, pixelate, etc.).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages