2014-12-13 75 views
1

我必须用双线性插值实现鱼眼变换。在一个像素变换后,我不再有整数坐标了,我想用双线性插值法在整数坐标上映射这个像素。问题在于,我发现在inetrnete上的双线性插值(参见例如Wikipedia)做了相反的事情:它通过使用具有整数坐标的四个邻居的坐标来给出一个非整数像素的值。我想做相反的事情,即将具有非整数坐标的一个像素映射到具有整数坐标的四个邻居。当然,有些东西我错过了,并有助于理解我的错误。鱼眼滤波器的双线性插值

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

+0

请你更具体,并添加一个明确的例子。 – 2014-12-13 13:05:59

+0

已编辑。我希望现在更清楚。 – 2014-12-13 13:16:41

回答

2

您的问题有点不清楚。根据我的理解,你有一个正常的图像,你想变成鱼眼般的图像。为此,我猜你从常规图像中获取每个像素坐标{xr,yr},使用鱼眼变换获得类似鱼眼图像中相应的坐标{xf,yf}。您想将初始像素强度分配给目标像素,但是由于{xf,yf}不是整数值,所以您不知道如何执行此操作。

如果是这样,您实际上是在向后解决问题。您应该从鱼眼图像中的整数像素坐标开始,使用反鱼眼变换获得常规图像中的浮点像素坐标,并使用双线性插值从4个最接近的整数坐标估计浮点坐标的强度。

的基本步骤如下:

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

请注意,根据等式推导逆鱼眼变换可能有点棘手......但是,这就是图像重采样如何执行的。

+0

我编辑的问题更清楚(希望)。我认为你理解我的问题,但我不确定要理解你的解决方案......谢谢 – 2014-12-13 13:17:57

+1

@NomeCognome:努力学习,这是正确的解决方案。 – 2014-12-13 13:35:33

+1

我编辑了我的答案,使其更清晰。你能指出你不明白的是什么吗? – AldurDisciple 2014-12-13 13:36:30

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))

+0

是的,我想我从错误的方向看问题......我会考虑它,并试图了解如何正确地解决问题!谢谢。 – 2014-12-13 13:55:30

+0

你的答案战争真的很有帮助!谢谢! – 2014-12-13 22:42:35