README - MAIN
Technical_Assignment_GOST.md - ТЗ
DNALabs.md - Информация о заказчике
INTERNAL_DOC.md - внутренняя документация
Image_processor - (dir) code
DATA - (dir) "Список литературы
Реализация программы для компании DNALabs описанной в ТЗ
Был получен запрос от компании DNALabs на создание простого консольного приложения для обработки файлов в формате BMP. Для компании очень важно, чтобы приложение было с понятной структурой, легко масштабируемое, быстрое и с возможностью безболезненно встроить в любую систему
Подробнее о компании и о том, для чего им полнадобилась эта программа написано в файле DNALabs.md
В этом проекте требуется реализовать консольное приложение, позволяющее применять к изображениям различные фильтры, аналогичные фильтрам в популярных графических редакторах.
Входные и выходные графические файлы должны быть в формате BMP.
Формат BMP поддерживает достаточно много вариаций, но в этом проекте будет использоваться
24-битный BMP без сжатия и без таблицы цветов. Именно в таком формате нейросеть компании DNALabs будет получать изображение
Тип используемого DIB header - BITMAPINFOHEADER.
Пример файла в нужном формате есть в статье на Википедии в разделе "Example 1" и в папке test_script/data.
Описание формата аргументов командной строки:
{имя программы} {путь к входному файлу} {путь к выходному файлу} [-{имя фильтра 1} [параметр фильтра 1] [параметр фильтра 2] ...] [-{имя фильтра 2} [параметр фильтра 1] [параметр фильтра 2] ...] ...
./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) – белый.
Если фильтр задан матрицей, это означает, что значение каждого из цветов определяется взвешенной суммой значений этого цвета в соседних пикселях в соответствии с матрицей. При этом целевому пикселю соответствует центральный элемент матрицы.
Например, для фильтра, заданного матрицей
Значение каждого из цветов целевого пикселя C[x][y] будет определяться формулой
C[x][y] =
min(1, max(0,
1*C[x-1][y-1] + 2*C[x][y-1] + 3*C[x+1][y-1] +
4*C[x-1][y] + 5*C[x][y] + 6*C[x+1][y] +
7*C[x-1][y+1] + 8*C[x][y+1] + 9*C[x+1][y+1]
))
При обработке пикселей, близких к краю изображения, часть матрицы может выходить за границу изображения. В таком случае в качестве значения пикселя, выходящего за границу, следует использовать значение ближайшего к нему пикселя изображения.
Обрезает изображение до заданных ширины и высоты. Используется верхняя левая часть изображения.
Если запрошенные ширина или высота превышают размеры исходного изображения, выдается доступная часть изображения.
Преобразует изображение в оттенки серого по формуле
Преобразует изображение в негатив по формуле
Повышение резкости. Достигается применением матрицы
Выделение границ. Изображение переводится в оттенки серого и применяется матрица
Пиксели со значением, превысившим threshold, окрашиваются в белый, остальные – в черный.
Гауссово размытие, параметр – сигма.
Значение каждого из цветов пикселя C[x0][y0] определяется формулой
Существуют различные варианты релализации и оптимизации вычисления этого фильтра, описание есть в Википедии.
Применять сторонние библиотеки для работы с изображениями запрещено.
Все компоненты программы должны быть по универсальными и не привязанными к специфике конкретной задачи.
Все исключительные ситуации должны корректно обрабатываться с выводом понятного пользователю сообщения об ошибке. Для этого используйте механизм исключений. Никакие сценарии, включая использование файлов с форматом, не соответствующим спецификации, не должны приводить к падению программы.
Для чтения и записи файлов будем использовать std::ifstream и std::ofstream.
Скорее всего, вам понадобятся следующие компоненты:
- Класс, представляющий изображение и обеспечивающий работу с ним
- Классы для чтения и записи формата BMP
- Фильтры
- Контроллер, управляющий последовательным применением фильтров
Общие части следует выделить через наследование.
- Дорохов Даниил
- Мария Николаева
На проект выделяется 10 дней
- Цель дня: создать базовую структуру проекта, настроить среду разработки.
- Задачи:
- Создать репозиторий на GitHub.
- Настроить
.gitignoreдля C++ и файлов проекта. - Написать
README.mdс описанием проекта. - Создать базовые директории (
test_script/data...).
- Цель дня: реализовать чтение и запись BMP файлов.
- Задачи:
- Изучить спецификацию формата BMP.
- Реализовать структуру
BMPHeaderдля работы с заголовками BMP. - Написать функции для чтения и записи BMP файлов (
loadBMP,saveBMP).
- Цель дня: добавить возможность обрезки изображения.
- Задачи:
- Разработать алгоритм для обрезки изображений.
- Реализовать функцию
cropдля применения фильтра к изображению. - Тестировать функцию на различных изображениях.
- Цель дня: реализовать преобразование изображения в оттенки серого.
- Задачи:
- Изучить алгоритм преобразования в оттенки серого.
- Реализовать функцию
grayscale. - Провести тестирование функции на разных изображениях.
- Цель дня: добавить возможность получения негатива изображения.
- Задачи:
- Изучить алгоритм получения негатива изображения.
- Реализовать функцию
negative. - Тестирование функции на разнообразных изображениях.
- Цель дня: реализовать фильтр повышения резкости.
- Задачи:
- Изучить алгоритм повышения резкости.
- Реализовать функцию
sharpening. - Протестировать на различных изображениях.
- Цель дня: добавить выделение границ на изображении.
- Задачи:
- Изучить метод выделения границ.
- Реализовать функцию
edgeDetection. - Провести тестирование на разных изображениях.
- Цель дня: реализовать интерфейс командной строки для работы с фильтрами.
- Задачи:
- Определить формат аргументов командной строки.
- Реализовать парсинг аргументов командной строки.
- Реализовать логику применения фильтров в соответствии с аргументами.
- Цель дня: обеспечить корректную работу приложения.
- Задачи:
- Создать тестовые сценарии для каждого фильтра.
- Протестировать последовательное применение нескольких фильтров. 3. Отладить обнаруженные проблемы.
- Цель дня: подготовить проект к релизу.
- Задачи:
- Документировать код и функции.
- Провести рефакторинг кода для повышения читаемости и производительности.
- Подготовить финальный коммит и релиз версии.
.
├── CMakeLists.txt
├── Color.cpp
├── Image.cpp
├── ImageProcessor.h
├── Parser.cpp
├── Parser.h
├── Reader.cpp
├── Reader.h
├── Utils.h
├── Writer.cpp
├── Writer.h
├── color.h
├── filter.cpp
├── filter.h
├── image.h
├── image_processor.cpp
└── test_script
├── data
│ ├── test_data_files
└── test_image_processor.py