Сейчас я просто копирую кортеж цветов с маленьких изображений на большое проходя каждый пиксель. Обрабатывает 10 фрагментов в секунду. Можно использовать другую библиотеку. Находил в интернете реализации с какими-то адскими конструкциями массивов. Они выдавали ошибки и я не смог разобраться, в чём дело.
# RGB
# 100x100 (10000) маленьких изображений размером 256x256 пикселей каждый
# финальное изображение 25600x25600
final = np.zeros((mapdata['tsize']['width'] * 256, mapdata['tsize']['height'] * 256, 3), np.uint8)
for x_tile in range(mapdata['tsize']['width']):# 0-99
for y_tile in range(mapdata['tsize']['height']):# 0-99
img = cv2.imread(f'{dir}/images/{x_tile}x{y_tile}.jpg')
for x in range(256):
for y in range(256):
final[x_tile*256+x, y_tile*256+y] = img[x, y]