Рассорка на разорванную карту

Узнай, как превратить рваную карту в козырную и выйти из игры победителем без единого блефа

Что такое рассорка?

Рассорка — это современная техника восстановления повреждённых графических файлов, особенно когда исходное изображение разорвано на множество фрагментов. Применяется в дизайне, фотошопе, машинном обучении и даже в играх, где важно «склеить» разорванную карту обратно без потери качества.

Зачем нужна «разорванная карта»?

В профессиональной среде под «картой» могут подразумеваться:

  • текстуры в играх;
  • географические карты (GIS);
  • данные нейросетей (например, векторные или растровые эмбеддинги);
  • сканы старых фотографий, порванных на части.

Повреждённые фрагменты визуально напоминают разорванную бумажную карту, отсюда и название.

Подготовка: инструменты и среда

Необходимое ПО

  1. Python 3.9+ — основной язык для скриптов рассорки.
  2. OpenCV и NumPy — работа с изображениями.
  3. PyTorch (опционально) — если будем использовать ИИ для упрощения задачи.
  4. Jupyter Notebook — удобный интерактив.
# Установка всех зависимостей за 1 команду
pip install opencv-python numpy torch torchvision jupyter

Файлы-«осколки»

Соберите все фрагменты в одну папку fragments/. Убедитесь, что:

  • формат одинаковый (PNG/JPG);
  • имена содержат координаты или номера фрагмента (например, x32_y57.png);
  • нет лишних файлов.

Шаг 1. Загрузка фрагментов

import cv2, glob, numpy as np
paths = sorted(glob.glob('fragments/*.png'))
fragments = [cv2.imread(p, cv2.IMREAD_UNCHANGED) for p in paths]

Массив fragments теперь содержит все кусочки в виде numpy-массивов.

Шаг 2. Определение исходного размера

Автоматический способ через EXIF

Если каждый файл содержит метаданные, можно извлечь реальные координаты:

from PIL import Image
for p in paths:
 img = Image.open(p)
 x = int(img.info.get('X', 0))
 y = int(img.info.get('Y', 0))
 # ... сохраняем смещения в словарь

Ручной способ (когда мета отсутствует)

  1. Найдите самый «левый» и «правый» фрагмент по горизонтали.
  2. Найдите самый «верхний» и «нижний» по вертикали.
  3. Умножьте ширину/высоту фрагмента на количество «рядов» и «колонн».

Шаг 3. Сборка карты

Создаём пустое холст-изображение нужного размера и вставляем кусочки:

h_piece, w_piece = fragments[0].shape[:2]
rows = max(y_coords) + 1
cols = max(x_coords) + 1
canvas = np.zeros((rowsh_piece, colsw_piece, 4), dtype=np.uint8)

for idx, (x, y) in enumerate(zip(x_coords, y_coords)):
 canvas[yh_piece:(y+1)h_piece, xw_piece:(x+1)w_piece] = fragments[idx]
cv2.imwrite('restored_map.png', canvas)

Шаг 4. Проверка качества

Сравните полученную карту с оригиналом (если имеется) через метрики:

  • MSE (Mean Squared Error), чем меньше, тем лучше;
  • SSIM (Structural Similarity) — ближе к 1.0 = идеально;
  • LPIPS — для «человеческого» восприятия (низкие значения = похоже).

Бонус: автоматизация через ChatGPT-подобный ассистент

Можно обернуть весь процесс в графический чат-бот, который:

  1. Принимает ZIP-архив с фрагментами от пользователя.
  2. Спрашивает, нужно ли использовать ИИ-дополнение (GAN-восстановление).
  3. Возвращает ссылку на скачивание финальной карты.

Такой бот работает на том же принципе, что и ChatGPT, но специализирован под задачи рассорки. Код шаблона доступен на GitHub (f/prompts.chat).

Советы по ускорению

  • Используйте cv2.cuda, если видеокарта поддерживает CUDA.
  • Храните куски в формате .npy — экономит 30–40 % времени на чтение.
  • Для очень больших карт разбивайте процесс на «пачки» и собирайте мозаикой.

Рассорка на разорванную карту больше не вызывает головной боли: достаточно пары десятков строк кода и грамотной подготовки фрагментов. С практикой процесс занимает меньше минуты на 1000 кусочков.
Экспериментируйте, автоматизируйте и делитесь вопросами в тематических сабреддитах — сообщество всегда поможет!