双线性插值伪影

Bilinear interpolation artifacts

我正在尝试使用 openCv 功能在 c++ 中旋转后进行双线性插值,但不使用 openCv 中实现的双线性插值。

在我的输出图像中,总是有一些伪影(完全不同的像素颜色)。

我正在使用这个公式:

双线性插值公式

我没有使用来自 math.h 的 ceil,而是来自 openCV 的 cvRound()。

所以我的输入是: 莉娜

我的工件输出是:

旋转插值后的Lena

我对所有 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)造成的。

尝试在分配给 B 之前将插值表达式限制在 [0,255]。