双线性插值伪影

Ště*_*rša 2 c++ interpolation opencv image-processing bilinear-interpolation

我尝试使用 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];
Run Code Online (Sandbox Code Playgroud)

xn 和 yn 是变换 MAT 中的坐标,它们是浮点数。

正如您所看到的,大部分输出图片都是按应有的方式计算的,但不知何故,它们很少是人工制品,这让我没有任何意义。我需要摆脱它们。

感谢您的任何建议。

Yve*_*ust 6

您看到的异常绿色像素一定是由绿色通道中的下溢(-1 变为 +255)引起的。

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