使用90°卷

时间:2016-02-05 19:45:59

标签: python c image opencv

我必须将一个equirectangular图像转换并重新映射到一个90°滚动的另一个equirectangular图像。

我用Pano2VR做到了。

问题是我必须从服务器端以编程方式执行。所以我不能使用G.U.I.这样做。

首先,我将研究工作面向 imagemagick 。我尝试了Fred ImageMagick scripts,却找不到任何人做我想做的事。此外,与 Pano2VR 相比,图像的处理时间显得非常长。

我将调查指向 OpenCV libgnomonic。这是目前最有趣的方式。该库允许用户将投影(equirectangular转换为直线,反之亦然)或make equirectangular mapping transformation。我玩Norama-suite,其中包含一些处理库的脚本。例如,我想将直线图像转换为equirectangular但输出只是一个黑色背景图像(为什么?我找不到答案)。

但是,第二个链接可以解决我的问题。我有这张图片:

我希望将其转换为此图片

嗯,我对C一点也不舒服。 我想我应该使用这两个文件:

但我不知道怎么做。最重要的是,我想了解。

我是正确的吗?在第一张图片上应用了哪些转换?有没有办法用python或bash脚本来做?

好的,谢谢你的帮助。

**在Python中编辑C的转换** 以下代码不起作用并返回和IndexError。 但是我试图捕捉并传递异常,图像的第一个右侧部分似乎没有改变。

import math
from PIL import Image

img = Image.open("img1.jpg")
img = img.convert('RGB')
pixel = img.load()
width, height = img.size

img2 = img.copy()
for y in xrange(height):
    for x in xrange(width):
        xx = 2*(y+0.5) / width - 1.0
        yy = 2*(y+0.5)/ height - 1.0
        lng = math.pi * xx
        lat = 0.5 * math.pi * yy

        # NOTE!  These axes are transposed because that's what the question is about
        Z = math.cos(lat) * math.cos(lng)  # normally X
        Y = math.cos(lat) * math.sin(lng)  # normally Y
        X = -math.sin(lat)                 # normally -Z
        D = math.sqrt(X*X+Y*Y)

        lat = math.atan2(Z, D)             # ? normally lat = math.asin(Z)
        lng = math.atan2(Y, X)

        #ix and iy must be integers
        ix = int((0.5 * lng / math.pi + 0.5) * width - 0.5)
        iy = int((lat/math.pi + 0.5) * height  - 0.5)

        #not sure of this part to remap the image
        newpixel = pixel[ix, iy]
        img2.putpixel([(x+width/4) % width, y], newpixel)
        #I tries as mentionned in the following code to invert x and y in the two previous lines but the index error out of range comes back 
img2.show()

1 个答案:

答案 0 :(得分:3)

您的转型有两个步骤。第一步是投影球的变换,第二步是90°滚动。

90°的equirectangular图像卷只是图像宽度的四分之一的水平位移。第一次转换更复杂:你基本上想要旋转球体,使得北极位于纬度0和经度0(几内亚湾的某个地方,如果你把地球作为参考。)

您可以通过这些步骤进行此转换;

  • 将每个像素的x和y位置转换为经度,-π≤long≤π,以及纬度,-π/2≤lat≤π/ 2。这是一个线性转换。
  • 在单位球面上创建相应经度和纬度的x,y和z坐标;正z是北极。
  • 旋转这些笛卡尔坐标。在您的情况下,您只需交换一些维度,但这可能是任何转换矩阵的一般转换。
  • 计算旋转坐标的longituide和纬度。
  • 将新的经度和纬度转换为像素位置。

这是有效的C代码。 (我知道你已经用Python标记了这个问题,但是下面的代码主要是在python中使用类似的公式。你必须小心:除了像素indix x之外,所有数字都是浮点数,{ {1}},yix。我会在Python中完成此操作,但我没有Python图像库的经验。)

iy

所得图像的质量可以,但不如参考图像的质量好,特别是在极点附近。更好的算法可以平均并平滑颜色值。上面的算法只是将一个目标像素映射到源像素。