鱼眼滤波器上的双线性插值

Bilinear interpolation on fisheye filter

本文关键字:双线性 插值 滤波器 鱼眼      更新时间:2023-10-16

我必须通过双线性插值实现鱼眼转换。一个像素转换后,我不再有整数坐标,我想使用双线性插值将此像素映射到整数坐标上。问题在于,我在 inetrnete 上的双线性插值(参见例如维基百科(上发现的所有事情都做了相反的事情:它通过使用具有整数坐标的四个邻居的坐标给出一个非整数像素的值。 我想做相反的事情,即将具有非整数坐标的一个像素映射到具有整数坐标的四个邻居。当然,我错过了一些东西,这将有助于了解我错在哪里。

编辑:更清楚一点:假设我有起始图像的像素 (i,j(=(2,2(。鱼眼变换后,我得到非整数坐标,例如 (2.1,2.2(。我想将此新像素保存到新图像中,但由于非整数坐标,显然我不知道将其保存在哪个像素中。最简单的方法是截断坐标,但图像质量不是很好:我必须使用双线性插值。尽管如此,我不明白它是如何工作的,因为我想将我的非整数像素拆分为具有新(转换后图像(的整数坐标的相邻像素,但我只找到了相反操作的描述,即查找从四个整数像素开始的非整数坐标 (http://en.wikipedia.org/wiki/Bilinear_interpolation(

你的问题有点不清楚。据我了解,你有一个常规的图像,你想把它转换成鱼眼镜头般的图像。为此,我猜你从常规图像中获取每个像素坐标{xr,yr},使用鱼眼变换在鱼眼状图像中获得相应的坐标{xf,yf}。您希望将初始像素强度分配给目标像素,但是您不知道如何执行此操作,因为 {xf,yf} 不是整数值。

如果是这样的话,你实际上是在把问题倒退。应从鱼眼图像中的整数像素坐标开始,使用逆鱼眼变换获取常规图像中的浮点像素坐标,并使用双线性插值从 4 个最近的整数坐标估计浮点坐标的强度。

基本步骤如下:

  1. 从鱼眼镜头图像中(xf,yf)的整数像素坐标开始(例如鱼眼图像中的 (2,3((。您希望估计与这些坐标关联的强度If
  2. 通过使用逆鱼眼变换将(xf,yf)映射到"起始"图像中,在"起始"图像中找到相应的点。您获得在"起始"图像中(xs,ys)的浮点像素坐标(例如,起始图像中的(2.2,2.5((。
  3. 使用双线性插值根据"起始"图像中 4 个最接近的整数像素坐标(例如起始图像中的 (2,2(、(2,3(、(3,2(、(3,3((估计坐标Is处的强度 (xs,ys)
  4. Is分配给If
  5. 使用下一个整数像素坐标重复步骤 1,直到找到鱼眼镜头图像所有像素的强度。

请注意,推导逆鱼眼变换可能有点棘手,具体取决于方程...但是,这就是必须执行图像重采样的方式。

您需要先找到反向鱼眼变换,然后使用"向后换行"从目标图像转到源图像。

我给你举一个简单的例子。假设您要将图像扩展为非整数因子 1.5。所以你有

x_dest = x_source * 1.5, y_dest = y_source * 1.5

现在,如果您遍历原始图像中的坐标,您将在目标图像中获得非整数坐标。 例如,(1,1( 将映射到 (1.5, 1.5(。这是您的问题,通常是"前换行"图像的问题。

相反,您反转转换并写入

x_source = x_dest / 1.5, y_source = y_dest / 1.5

现在,循环访问目标图像像素。例如,目标图像中的像素 (4,4( 来自源图像中的 (4/1.5, 4/1.5( = (2.6, 2.6(。这些是非积分坐标,您可以使用源图像中的 4 个相邻像素来估计此坐标处的颜色(在我们的示例中为 (2,2(、(2,3(、(3,2( 和 (3,3( 处的像素(