Что такое рассорка?
Рассорка — это современная техника восстановления повреждённых графических файлов, особенно когда исходное изображение разорвано на множество фрагментов. Применяется в дизайне, фотошопе, машинном обучении и даже в играх, где важно «склеить» разорванную карту обратно без потери качества.
Зачем нужна «разорванная карта»?
В профессиональной среде под «картой» могут подразумеваться:
- текстуры в играх;
- географические карты (GIS);
- данные нейросетей (например, векторные или растровые эмбеддинги);
- сканы старых фотографий, порванных на части.
Повреждённые фрагменты визуально напоминают разорванную бумажную карту, отсюда и название.
Подготовка: инструменты и среда
Необходимое ПО
- Python 3.9+ — основной язык для скриптов рассорки.
- OpenCV и NumPy — работа с изображениями.
- PyTorch (опционально) — если будем использовать ИИ для упрощения задачи.
- 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))
# ... сохраняем смещения в словарь Ручной способ (когда мета отсутствует)
- Найдите самый «левый» и «правый» фрагмент по горизонтали.
- Найдите самый «верхний» и «нижний» по вертикали.
- Умножьте ширину/высоту фрагмента на количество «рядов» и «колонн».
Шаг 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-подобный ассистент
Можно обернуть весь процесс в графический чат-бот, который:
- Принимает ZIP-архив с фрагментами от пользователя.
- Спрашивает, нужно ли использовать ИИ-дополнение (GAN-восстановление).
- Возвращает ссылку на скачивание финальной карты.
Такой бот работает на том же принципе, что и ChatGPT, но специализирован под задачи рассорки. Код шаблона доступен на GitHub (f/prompts.chat).
Советы по ускорению
- Используйте
cv2.cuda, если видеокарта поддерживает CUDA. - Храните куски в формате
.npy— экономит 30–40 % времени на чтение. - Для очень больших карт разбивайте процесс на «пачки» и собирайте мозаикой.
Рассорка на разорванную карту больше не вызывает головной боли: достаточно пары десятков строк кода и грамотной подготовки фрагментов. С практикой процесс занимает меньше минуты на 1000 кусочков.
Экспериментируйте, автоматизируйте и делитесь вопросами в тематических сабреддитах — сообщество всегда поможет!