У меня есть 2-мерный массив, это интерпретация монохромного изображения. Я бы хотел изменить его до определенного, известного размера. Качество не является существенным. Если мне нужно изменить размер до размера 2x или 4x, все в порядке, просто используя интерполяцию ближайшего соседа, вместо 4 пикселя вместо одного. В принципе, если мне нужно интерполировать мое изображение на x1.5, я увеличу размер x3 и уменьшу его x2. Я прав? Но что мне делать, когда мне нужно увеличить изображение до 3х, например? Как должны быть размещены пиксели в интерполированном массиве? Было бы здорово, если бы вы указали какую-либо информацию, коды, ссылки на другие сайты.Базовая интерполяция, масштабирование вверх и вниз
2
A
ответ
4
Трюк думает обратным образом: не пытайтесь поместить пиксель исходного изображения в масштабированное изображение, но найдите пиксель в исходном изображении, которое должно быть помещено в масштабированное изображение.
Это будет выглядеть примерно так:
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];
}
Для демонстрационных целей этот код зажимает изображение на нижнем правом углу, так что программа не вылетает из массива переполнении (это то, что станд :: max - для).
Ничего себе, спасибо большое, теперь я попытаюсь понять этот фрагмент кода. Надеюсь, все будет хорошо. – user1131662