Задание 1: Основы работы с изображениями

Обязательная часть задания

Должна быть разработана программа, реализующая следующий функционал:

  • Отражение изображения по вертикали и по горизонтали
  • Извлечение фрагмента изображения
  • Поворот изображений по и против часовой стрелки на произвольное число градусов, кратное 90
  • Расширение изображения с помощью дублирования пикселей, нечётного и чётного продолжения
  • Свёртка с фильтром Гаусса с произвольным выбором параметра — радиуса σ
  • Вычисление модуля градиента как корень из суммы квадратов свёрток с первой производной фильтра Гаусса по горизонтали и вертикали

Дополительная часть задания

Реализовать следующий функционал:

  • Вычисление гистограммы
  • Эквализация гистограммы

Требования

  • Недопустимо использовать готовые библиотечные функции. Можно: любые векторные и матричные операции, включая вычисление свёртки. Ядро фильтра Гаусса должно быть вычислено самостоятельно.
  • При выводе результата значения, выходящие за пределы диапазона [0, 255], должны быть усечены до 0 или 255. В промежуточных вычислениях данного усечения быть не должно.
  • При вычислении модуля градиента должно быть произведено контрастирование — расширение диапазона с [0, gmax] до [0, 255], где gmax — максимальное значение модуля градиента среди всего изображения. При этом не должно быть потерь, связанных с округлением, на промежуточных этапах.
  • При вычислении свёрток не должен меняться размер изображения. При обращении к пикселям, лежащим за пределами изображения, должно быть проведено расширение изображения.
  • Результат вычисления гистограммы — текстовый файл, состоящий из 256 строк, в каждой строке — количество пикселей, имеющих интенсивность, равную номеру строки, начиная с 0.

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

Программа должна поддерживать запуск из командной строки со строго определённым форматом команд:

python main.py (command) (parameters...) (input_file) (output_file)

Список команд:

mirror {x|y}
  Отражение по горизонтали или по вертикали, в зависимости от указанного параметра
extract (left_x) (top_y) (width) (height)
  Извлечение фрагмента изображения
rotate {cw|ccw} (angle) Поворот по или против часовой стрелки на заданное количество градусов, например: rotate cw 90
extend {dup|even|odd} (size)
  Расширение изображения на size пикселей с каждой стороны с использованием дублирования пикселей, чётного и нечётного продолжения соответственно
gauss (sigma) Фильтр Гаусса, параметр sigma — вещественный параметр фильтра
gradient (sigma) Модуль градиента
calc_hist Вычисление гистограммы
eq_hist Эквализация гистограммы

Замечания

  • Для массива [3, 4, 5, 6] чётным продолжением будет являться [5, 4, 3, 4, 5, 6, 5, 4], а нечётным — [1, 2, 3, 4, 5, 6, 7, 8]
  • В команде extract первыми аргументами передаются координаты левого верхнего пикселя

Примеры изображений


Исходное изображение

Отражение по горизонтали
mirror x in.bmp out.bmp

Отражение по вертикали
mirror y in.bmp out.bmp

Извлечение фрагмента
extract 5 6 143 85 in.bmp out.bmp

Поворот
rotate cw 90 in.bmp out.bmp

Поворот
rotate cw 180 in.bmp out.bmp

Расширение (дублирование)
extend dup 7 in.bmp out.bmp

Чётное продолжение
extend even 7 in.bmp out.bmp

Нечётное продолжение
extend odd 7 in.bmp out.bmp

Фильтр Гаусса (σ = 2)
gauss 2 in.bmp out.bmp

Фильтр Гаусса (σ = 3)
gauss 3 in.bmp out.bmp

Фильтр Гаусса (σ = 5)
gauss 5 in.bmp out.bmp

Модуль градиента (σ = 3)
gradient 3 in.bmp out.bmp

Выравнивание гистограммы
eq_hist in.bmp out.bmp

Справочные материалы