OpenCV — по-разному масштабировать / растягивать каждый ряд пикселей изображения?

Я хочу увеличить / растянуть изображение по горизонтали, но каждый ряд пикселей должен иметь разный масштаб в зависимости от положения строки или номера строки?

Я сделал это путем обрезки исходного изображения строка за строкой в ​​кадрирование с высотой 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:

введите описание изображения здесь

0

Решение

Попробуйте использовать функцию remap, как описано в этот урок. Он должен позволять вам устанавливать новые координаты x и y для каждой точки на вашем изображении (и он обрабатывает всю интерполяцию).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]