Пришел примерно к такому решению, может кому пригодится
var largeImg = cv.imread('./largeImg.jpg'); // загружаем какое-то большое изображение
// либо можно сгенерировать new cv.Mat(new Array(15360).fill( new Array(15360).fill([0,0,0]) ), cv.CV_8UC3);
var blockSideSize = 2048; // размер стороны в пикселях, он же и оффсет, т.е. блоки у нас 2048х2048
for (let x = 0; x < 3; x++) {
for (let y = 0; y < 3; y++) {
// тупо попиксельно заменяем каждый цвет
let block = cv.imread(`./blocks/block_${x}-${y}.jpg`);
for (let y1 = 0; y1 < blockSideSize; y1++) {
for (let x1 = 0; x1 < blockSideSize; x1++) {
largeImg.set((y * blockSideSize + y1), (x * blockSideSize + x1), block.at(y1, x1));
};
};
};
};
cv.imwrite('./ResultLargeImage.jpg', largeImg);