A очень базовый подход состоит в том, чтобы взять ваше целевое изображение (изображение, которым вы хотите, чтобы ваше синтезированное изображение выглядело) и вырезать его в меньшие изображения в набор изображений, который мы можем назвать T.
Найти «средний цвет» каждого изображения в T.
Возьмите ваш набор изображений друзей, давайте назовем этот набор F и найдем «средний цвет» каждого из них.
Теперь сопоставьте каждое изображение в T с изображением в F, чтобы расстояние между цветами было как можно меньше. Здесь вам нужно будет рассмотреть, разрешаете ли вы использовать одно и то же изображение в F для нескольких изображений в T.
Немного менее базовый подход (при использовании тех же наборов, что и выше):
Среднее значение фильтра каждого изображения по T и F (как при размытии их)
Сопоставьте каждое изображение в T с изображением в F, используя вычисления наименьших квадратов.
Другие более продвинутые подходы, которые я могу придумать, но более сложные по математике:
- Использование анализа главных компонентов для выбора основных компонентов из F и T и их сопоставления.
- Использование дескриптора любого типа (SIFT, SURF, ...) для поиска изображения в F на целевом изображении. Это позволит вам иметь неровную сетку или вообще не иметь сетки, где два изображения в F могут очень хорошо иметь очень разные размеры в результирующем изображении.
Что касается структуры, я не думаю, что это вообще имеет значение. Тем не менее, вам нужна хорошая библиотека изображений, чтобы упростить управление изображениями.