Занятие 1: Что такое картинка? Осветлим, заблюрим, обострим, уменьшим!
1) Убедитесь что есть компилятор и IDE. Я предпочитаю CLion (установщик на яндекс.диске), но любая IDE (или текстовый редактор подойдут):
1.1) Если вы на windows - советую установить Visual Studio Community (чтобы использовать ее компилятор) и затем утановить CLion
1.2) Если вы на linux - советую установить CLion (нам подойдет любой компилятор g++/clang)
1.3) Если вы на macos - советую установить CLion (нам подойдет любой компилятор g++/clang)
2) Создайте пустой CMake + C++ проект, запустите main.cpp, убедитесь что он выводит Hello, World!
3) Создайте локальный git репозиторий (или даже лучше - выложите свой проект на гитхаб, в частности это даст автоматическую проверку юнит-тестов после каждого коммита), подробнее как это сделать описано тут
4) Изучите main.cpp (код) и CMakeLists.txt (описывает что нужно компилировать). Сделайте commit (и push если выложили на github/gitlab) этих двух файлов с сообщением навроде basic hello world project
CI, Continous Integration - автоматическая проверка коммитов
5) Если используете github - добавьте автоматическую проверку что код компилируется (т.н. Continous Integration - CI), например просто спросите ChatGPT:
У меня есть простой C++ проект
В нем два файла main.cpp и CMakeLists.txt (простой hello world)
Я выложил этот проект на github
Как мне сделать так чтобы у меня появился Continous Integration (CI)?
Т.е. чтобы github при каждом моем изменении проекта (commit+push) проверял что мой проект компилируется под windows, linux, macos?
Оказывается достаточно добавить некий файл конфигурации CI /.github/workflows/ci.yml - см. например мой коммит. Если вам что-то в нем любопытно - спросите меня или ChatGPT!
Запушьте этот файл и обратите внимание что теперь у коммитов появляются галочки если все компилируется (и красные крестики если случилась какая-то ошибка компиляции).
Например у меня появился красный крестик из-за того что в CMakeLists.txt требуется версия 4.1 или выше, а на GitHub CI оказалось 3.31:

Исправляем это снизив требования к версии CMake, делаем commit+push, смотрим на красивую зеленую галочку:

Как добавить в проект считывание картинок
Когда я готовил черновой проект - многое писала LLM, например создать простой проект без использования внешних библиотек можно вот так: см. на этот промпт
Практическая часть
Предлагаю вам начать с проекта-заготовки, там уже есть весь скелет проекта и пример фотографии.
Считаем картинку, сделаем ярче, сохраним
Итак, вы скачали проект-заготовку, открыли его в CLion, может быть выложили у себя на github ради CI.
Задание 1 Запустите main и убедитесь что черная картинка сохранилась по пути copy.jpg.
Если кидает ошибку что картинка по относительному пути не найдена - проверьте папку из которой запускается программа - working directory (и выставите ее так чтобы она указала на корень проекта):

Картинка - это матрица пикселей. В каждом пикселе значение яркости (одно если черно-белая картинка, три - если трехканальная: RGB - Red Green Blue).
Индексация бывает разной, но наша конвенция такая (полезно держать либо иллюстрацию, либо на бумажке картинку, чтобы не путаться):

Задание 2 Теперь давайте как-то воздействуем на картинку, например осветлим ее - пробегите в цикле по всем пикселям, по всем трем каналам - домножьте на два. Запустите, стала ли картинка ярче? Попробуйте еще как-то поэкспериментировать.
Размытие картинки (гауссов блюр)
Вопрос Что такое резкость? Что такое размытие? Какая из этих двух картинок более резкая, какая более размытая?

Вопрос Давайте сделаем картинку более размытой, как этого добиться?
Задание 3 В main.cpp сделайте картинку более размытой - в пикселе-результате посчитайте среднюю яркость в некоторой окрестности, например в окне 10х10.
Гауссово размытие (Гауссов блюр) - это взвешенное среднее (свертка с ядром Гаусса, convolution), веса выглядят так:

Вопрос Какие свойства отличаются у гауссова размытия от усреднения в окне?
Увеличиваем резкость картинки
Вопрос Что будет если взять картинку А, размыть ее и получить картинку B. Затем найти картинку C=A+(A-B). Как будет выглядеть картинка?
Задание 4 Попробуйте!
Уменьшаем размер картинки
Задание 5 Постройте картинку в 16 раз меньше. Как вам качество результата? А что делать если коэффициент уменьшения размера не целый?
Выводы
- Картинка - это функция. Картинка мало отличается от дискретизированной функции, например в “картинке” может храниться ландшафт - карта высот местности
- Локальный git - это просто и удобно, позволяет сохранять промежуточные изменения
- GitHub Actions CI - позволяет при каждом commit+push проверять что вы случайно не сломали проект
- Многое можно узнать от LLM - если задавать ей вопросы а не просить дать готовый результат
- Следить за конвенциями/системами координат - чтобы меньше путаться, меньше багать и легче проверять код на корректность
К следующему занятию
Задание 6 Преобразуйте картинку из цветной в черно-белую. Попробуйте сделать не всю картинку ярче, а только какой-то один канал.
Вопрос Зная что у нас темный фон - как автоматически угадывать его цвет чтобы про каждый пиксель понять - фон это или кусок пазла? А что если в какой-то фотографии фон более темный, а в какой-то более светлый?
Задание 7 Подумайте, может у вас появятся вопросы к коду, структуре проекта или чему-то еще.
