【问题标题】:Bilinear interpolation artifacts双线性插值伪影
【发布时间】:2018-04-29 12:46:38
【问题描述】:

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

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

我使用这个公式:

双线性插值公式

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

所以我的输入是: 莉娜

我的工件输出是:

旋转和插值后的莉娜

我对所有 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?您是否确保没有发生 unsignrf 字节上溢/下溢?拆分您的代码行以分隔所有值和因素,以便更轻松地找到错误(稍后优化)。也许首先以浮点精度计算整个值以防止字节范围问题(稍后优化)
  • 您确定伪影是由于插值阶段而不是旋转造成的吗?
  • 快速浏览表明所有工件都在最黑暗的区域,所以当接近零时,我有点想欠/溢出。只是一个想法。

标签: c++ opencv image-processing interpolation bilinear-interpolation


【解决方案1】:

你看到的异常绿色像素一定是绿色通道下溢(-1变成+255)造成的。

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

【讨论】:

  • 谢谢:)
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
相关资源
最近更新 更多