Фотограф, снимая пейзажи, сделал много снимков. Однако, часть снимков оказались повёрнуты на угол, кратный 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 |
Примеры автоматического поворота:
|
|
|
|
|
|
|
|
Исходные изображения |
Результаты |
Справочные материалы