Задание 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 | 
 | 
 
 
Справочные материалы
 
   
      
      
     | 
    
   
  
     |     
    
   
 
 |