Билинейные интерполяционные артефакты - PullRequest
0 голосов
/ 29 апреля 2018

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

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

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

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

image

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

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

image

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

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

image

Я использую эту формулу для всех значений 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 Ответ

0 голосов
/ 29 апреля 2018

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

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

...