Я хочу увеличить / растянуть изображение по горизонтали, но каждый ряд пикселей должен иметь разный масштаб в зависимости от положения строки или номера строки?
Я сделал это путем обрезки исходного изображения строка за строкой в кадрирование с высотой 1 пиксель, а затем с помощью изменения размера изменил масштаб каждой строки по своему желанию и, наконец, скопировал масштабированный ряд пикселей на результирующем изображении: вот мой код:
cv::Rect rowCropRect = cv::Rect(0,i, imgOut.size().width, 1);
cv::Size scaledSize = cv::Size((1.f - smallFrameRatio) * rowCropRect.size().width, 1);
if (smallestWidth < scaledSize.width)
smallestWidth = scaledSize.width;
Mat eachRowCrop(imgIn, rowCropRect);
resize(eachRowCrop, eachRowCrop, scaledSize);
rowCropRect.x = (imgIn.size().width - eachRowCrop.size().width) * 0.5f;
rowCropRect.width = eachRowCrop.size().width;
if (rowCropRect.x < 0) rowCropRect.x = 0;
if (rowCropRect.width >= imgOut.size().width) rowCropRect.width = imgOut.size().width - 5;
eachRowCrop.copyTo(imgOut(rowCropRect));
eachRowCrop.release();
Я делаю это путем итерации каждой строки в цикле. Но его медленное и результирующее преобразование недостаточно хорошо.
Я хочу иметь возможность сделать это непосредственно на уровне пикселей, используя некоторые математические методы интерполяции, которые внутренне использует cv :: resize (), ИЛИ каким-либо другим эффективным способом.
Есть идеи ?
SourceImage:
ResultImage:
Попробуйте использовать функцию remap, как описано в этот урок. Он должен позволять вам устанавливать новые координаты x и y для каждой точки на вашем изображении (и он обрабатывает всю интерполяцию).
Других решений пока нет …