python– 使用90°滚动转换并重新映射equirectangular图像

python– 使用90°滚动转换并重新映射equirectangular图像,第1张

概述我必须将一个equirectangular图像转换并重新映射到另一个90°滚动的equirectangular图像.我用Pano2VR做了.问题是我必须从服务器端以编程方式执行此 *** 作.所以我不能使用G.U.I.去做吧.首先,我将我的研究定位于imagemagick.我尝试了Fred ImageMagick scripts,但找不到任何人做我想做的事.而且,与

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

我用Pano2VR做了.

问题是我必须从服务器端以编程方式执行此 *** 作.所以我不能使用G.U.I.去做吧.

首先,我将我的研究定位于imagemagick.我尝试了Fred ImageMagick scripts,但找不到任何人做我想做的事.而且,与Pano2VR相比,图像的处理时间显得非常长.

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

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

我想把它转换成这个图像

好吧,我对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 mathfrom PIL import Imageimg = Image.open("img1.jpg")img = img.convert('RGB')pixel = img.load()wIDth,height = img.sizeimg2 = 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()
最佳答案您的转型有两个步骤.第一步是投影球的变换,第二步是90°滚动.

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

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

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

这是有效的C代码. (我知道你已经用Python标记了这个问题,但是下面的代码主要是在python中使用类似的公式.你必须小心:除了像素indixes x,y,ix和iy之外,所有数字都是浮点数.我本可以在Python中完成这项工作,但我没有Python图像库的经验.)

for (y = 0; y < height; y++) {    for (x = 0; x < wIDth; x++) {        double xx = 2 * (x + 0.5) / wIDth - 1.0;        double yy = 2 * (y + 0.5) / height - 1.0;        double lng = pi * xx;        double lat = 0.5 * pi * yy;        double X,Y,Z;        double D;        int ix,iy;        Z = cos(lat) * cos(lng);    // corresponds to original x        Y = cos(lat) * sin(lng);    // corresponds to original y        X = -sin(lat);              // corresponds to original z        D = sqrt(X*X + Y*Y);        // distance in the XY plane        lat = atan2(Z,D);        lng = atan2(Y,X);        ix = (0.5 * lng / pi + 0.5) * wIDth - 0.5;        iy = (lat / pi + 0.5) * height - 0.5;        dest[y][(x + wIDth / 4) % wIDth] = src[iy][ix];                                    // wIDth/4 offset ist the 90° roll                                    // % wIDth wraps the longitude    }}

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

以上是内存溢出为你收集整理的python – 使用90°滚动转换并重新映射equirectangular图像全部内容,希望文章能够帮你解决python – 使用90°滚动转换并重新映射equirectangular图像所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1206391.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存