【发布时间】:2016-05-15 21:51:37
【问题描述】:
我必须将 equirectangular 图像转换并重新映射到另一个 90° 滚动的 equirectangular 图像。
我用Pano2VR 做到了。
问题是我必须从服务器端以编程方式进行。所以我不能使用 G.U.I.去做吧。
首先,我的研究方向是imagemagick。我尝试了Fred ImageMagick scripts,但找不到任何人来做我想做的事。此外,与Pano2VR相比,图像的处理时间显得非常长。
我将我的调查指向 OpenCV 和 libgnomonic。这是目前最有趣的方式。该库允许用户转换投影(等矩形到直线,反之亦然)或make equirectangular mapping transformation。我玩过Norama-suite,它包含一些处理库的脚本。例如,我想将直线图像转换为等角矩形,但输出只是黑色背景图像(为什么?我没有找到答案)。
但是,第二个链接可以解决我的问题。我有这张图片:
我想把它转换成这张图片
嗯,我对 C 一点也不满意。 我想我应该使用这两个文件:
- https://www.github.com/FoxelSA/libgnomonic/blob/master/src/gnomonic-transform.h
- https://www.github.com/FoxelSA/libgnomonic/blob/master/src/gnomonic-transform.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()
【问题讨论】: