Базовая интерполяция, увеличение и уменьшение - PullRequest
2 голосов
/ 05 января 2012

У меня есть двумерный массив, это интерпретация монохромного изображения. Я хотел бы изменить его размер до определенного, известного размера. Качество не важно. Если мне нужно изменить его размер до 2x или 4x, это нормально, просто используя интерполяцию ближайшего соседа, например, поместив 4 пикселя вместо одного. По сути, если мне нужно интерполировать мое изображение до х1,5, я увеличу размер х3 и уменьшу его х2. Я прав? Но что мне делать, например, когда мне нужно увеличить изображение до 3х? Как тогда размещать пиксели в интерполированном массиве? Было бы здорово, если вы дадите какую-либо информацию, коды, ссылки на другие сайты.

1 Ответ

4 голосов
/ 05 января 2012

Хитрость заключается в обратном: не пытайтесь поместить пиксель исходного изображения в масштабированное изображение, но найдите пиксель в исходном изображении, который должен быть помещен в масштабированное изображение.

Это будет выглядеть примерно так:

float scaleFactor = 3.0f;

for (int y=0; y < scaledImageHeight; y++)
  for (int x=0; x < scaledImageWidth; x++) {
    int sourceImageX = (int)std::max(x * 1.0f / scaleFactor, (float)(sourceImageWidth - 1));
    int sourceImageY = (int)std::max(y * 1.0f / scaleFactor, (float)(sourceImageHeight - 1));
    scaledImage[y * scaledImageWidth + x] = sourceImage[sourceImageY * sourceImageWidth + sourceImageX];
  }

В демонстрационных целях этот код сжимает изображение в правом нижнем углу, поэтому программа не аварийно завершает работу из-за переполнения массива (для этого используется std :: max).

...