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

Фотограф, снимая пейзажи, сделал много снимков. Однако, часть снимков оказались повёрнуты на угол, кратный 90 градусам. Помогите фотографу решить проблему в автоматическом режиме.

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

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

  • Отражение изображения относительно горизонтальной, вертикальной и диагональных осей
  • Извлечение фрагмента изображения
  • Поворот изображений по и против часовой стрелки на произвольное число градусов, кратное 90
  • Автоматический поворот изображения согласно описанному ниже алгоритму

Определять угол поворота предлагается по следующему алгоритму: предполагается, что на всех фотографиях верхняя часть изображения (небо, облака) светлее нижней. Таким образом, можно вычислить разницу между суммарной интенсивностью в верхней половине изображения и в нижней половине. При правильном выборе угла поворота данное значение будет максимальным. Гарантируется, что изображений, не удовлетворяющих этому предположению, при проверке не будет.

Указания и пояснения

  • При извлечении фрагмента координаты могут выходить за границы исходного изображения. В этом случае изображение должно быть дополнено нулями.
  • Пиксель с координатами (0, 0) находится в левом верхнем углу изображения, ось X направлена вправо, ось Y — вниз.
  • Значения угла поворота, смещения фрагмента могут будет быть нулевыми и отрицательными.

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

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

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

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

mirror {h|v|d|cd}
  Отражение относительно горизонтальной оси (h), вертикальной оси (v), главной диагонали (d), побочной диагонали (cd)
extract (left_x) (top_y) (width) (height)
  Извлечение фрагмента изображения с параметрами: отступ слева (left_x, целое), отступ сверху (top_y, целое), ширина фрагмента (width, положительное), высота фрагмента (height, положительное)
rotate {cw|ccw} (angle) Поворот по (cw) или против (ccw) часовой стрелки на заданное количество градусов, например: rotate cw 90
autorotate Автоматический поворот на угол 0, 90, 180 или 270 градусов согласно предложенному алгоритму

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


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

Отражение вдоль горизонтальной оси
mirror h ex.bmp ex_mirror_h.bmp

Отражение вдоль вертикальной оси
mirror v ex.bmp ex_mirror_h.bmp

Отражение вдоль главной диагонали
mirror d ex.bmp ex_mirror_d.bmp

Отражение вдоль побочной диагонали
mirror сd ex.bmp ex_mirror_сd.bmp

Поворот на 90 градусов по часовой стрелке
rotate cw 90 ex.bmp ex_rotate90.bmp

Поворот на 180 градусов
rotate cw 180 ex.bmp ex_rotate180.bmp

Поворот на 90 градусов против часовой стрелки
rotate ccw 90 ex.bmp ex_rotate270.bmp

Извлечение фрагмента
extract -32 32 192 96 ex.bmp ex_fragm.bmp

Примеры автоматического поворота:

Исходные изображения Результаты

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