我必须用双线性插值实现鱼眼变换。在转换一个像素之后,我不再具有整数坐标,并且我想使用双线性插值将该像素映射到整数坐标上。问题在于,我在inetrnete(例如维基百科)上的双线性插值上找到了相反的东西:它通过使用具有整数坐标的四个邻居的坐标来给出一个非整数像素的值。我想做相反的事情,即将具有非整数坐标的一个像素映射到具有整数坐标的四个邻居。当然有一些我缺少的东西,有助于理解我错在哪里。
编辑: 更清楚:假设我有起始图像的像素(i,j)=(2,2)。在鱼眼变换之后,我获得非整数坐标,例如(2.1,2.2)。我想将这个新像素保存到一个新图像,但显然我不知道由于非整数坐标而在哪个像素中保存它。最简单的方法是截断坐标,但图像质量不是很好:我必须使用双线性插值。尽管如此,我不明白它是如何工作的,因为我想将非整数像素分割成具有新(变换图像)的整数坐标的相邻像素,但我发现只有相反操作的描述,即找到非整数坐标从四个整数像素(http://en.wikipedia.org/wiki/Bilinear_interpolation)
开始答案 0 :(得分:2)
你的问题有点不清楚。根据我的理解,你有一个常规的图像,你想要转换成鱼眼般的图像。为此,我猜你从常规图像中取出每个像素坐标{xr,yr},使用鱼眼变换来获得类似鱼眼图像中的相应坐标{xf,yf}。您希望将初始像素强度分配给目标像素,但是您不知道如何执行此操作,因为{xf,yf}不是整数值。
如果是这种情况,那么你实际上是在向后解决问题。您应该从鱼眼图像中的整数像素坐标开始,使用逆鱼眼变换获得常规图像中的浮点像素坐标,并使用双线性插值从4个最接近的整数坐标估计浮点坐标的强度。 / p>
基本程序如下:
(xf,yf)
开始(例如,鱼眼图像中的(2,3))。您想要估算与这些坐标相关联的强度If
。(xf,yf)
映射到“起始”图像,找到“起始”图像中的对应点。您可以在“起始”图像中获得浮点像素坐标(xs,ys)
(例如,起始图像中的(2.2,2.5))。Is
处的强度(xs,ys)
,基于“起始”图像中4个最接近的整数像素坐标的强度(例如(2,2),(2) ,3),(3,2),(3,3)在起始图像中)Is
分配给If
请注意,根据方程式,导出逆鱼眼变换可能有点棘手......但是,这就是必须执行图像重采样的方法。
答案 1 :(得分: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))