Я пытаюсь сделать билинейную интерполяцию после поворота в 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, они являются числами с плавающей точкой.
Как вы можете видеть, большая часть выходного изображения рассчитывается так, как должно быть, но почему-то это мало артефактов, которые не имеют смысла. Мне нужно от них избавиться.
Спасибо за любой совет.
Ненормальные зеленые пиксели, которые вы видите, должны быть вызваны недостаточным (-1 становится +255) в зеленом канале.
Попробуйте закрепить интерполяционное выражение до [0,255] перед присвоением B.
Других решений пока нет …