Билинейные интерполяционные артефакты

Я пытаюсь сделать билинейную интерполяцию после поворота в c ++ с использованием возможностей openCv, но без использования билинейной интерполяции, реализованной в openCv.

На моих выходных изображениях всегда есть некоторые артефакты (всего разные цвета пикселей).

Я использую эту формулу:

Билинейная интерполяционная формула

Я не использую ceil из math.h, но cvRound () из openCV.

Итак, мой вклад:
Лена

И мой вывод с артефактами:

Лена после вращения и интерполяции

Я использую эту формулу для всех значений RGB, поэтому для B это выглядит так:

int l = cvRound(xn);
int k = cvRound(yn);

float a = xn-l;
float b = yn-k;

uchar B = (1-a)*(1-b)*src.at<cv::Vec3b>(l,k).val[0]+a*(1-b)*src.at<cv::Vec3b>(l+1,k).val[0]+b*(1-a)*src.at<cv::Vec3b>(l,k+1).val[0]+a*b*src.at<cv::Vec3b>(l+1,k+1).val[0];

xn и yn — координаты в преобразовании MAT, они являются числами с плавающей точкой.

Как вы можете видеть, большая часть выходного изображения рассчитывается так, как должно быть, но почему-то это мало артефактов, которые не имеют смысла. Мне нужно от них избавиться.

Спасибо за любой совет.

0

Решение

Ненормальные зеленые пиксели, которые вы видите, должны быть вызваны недостаточным (-1 становится +255) в зеленом канале.

Попробуйте закрепить интерполяционное выражение до [0,255] перед присвоением B.

4

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector