Skip to main content

Convertion between cubemap and equirectangular and also to perspective planar.

Project description

py360convert

Features of this project:

  • Conversion between cubemap and equirectangular:
  • Conversion between Equirectangular and planar:
  • Pure python implementation and depend only on numpy and scipy.
  • Vectorization implementation:
    • If opencv is installed, py360convert will automatically use it to accelerate computations (several times speedup).

Install

pip install py360convert

You can use the library with import py360convert and through the command line tool convert360.

Command line examples

The convert360 command line tool can be run like so. Use convert360 -h for details. The convert360 python script is also doubles as ab example code for how to use this as a package in your code.

convert360 e2c assets/example_input.png out.png --size 200
Input Equirectangular Output Cubemap

convert360 c2e assets/example_e2c.png out.png --width 800 --height 400
Input Cubemap Output Equirectangular

You can see the blurring artifacts in the polar region because the equirectangular in above figure are resampled twice (e2c then c2e).


convert360 e2p assets/example_input.png out.png --width 300 --height 300 --yaw 120 --pitch 23
Input Equirectangular Output Perspective

Doc

c2e(cubemap, h, w, cube_format='dice')

Convert the given cubemap to equirectangular.
Parameters:

  • cubemap: Numpy array or list/dict of numpy array (depend on cube_format).

  • h: Output equirectangular height.

  • w: Output equirectangular width.

  • mode:str: Interpolation method; typically bilinear or nearest. Valid options: "nearest", "linear", "bilinear", "biquadratic", "quadratic", "quad", "bicubic", "cubic", "biquartic", "quartic", "biquintic", "quintic".

  • cube_format: Options: 'dice' (default), 'horizon' or 'dict' or 'list'. Indicates the format of the given cubemap.

    • Say that each face of the cube is in shape of 256 (width) x 256 (height)

    • 'dice': a numpy array in shape of 1024 x 768 like below example

    • 'horizon': a numpy array in shape of 1536 x 256 like below example

    • 'list': a list with 6 elements each of which is a numpy array in the shape of 256 x 256. It's just converted from 'horizon' format with one line of code: np.split(cube_h, 6, axis=1).

    • 'dict': a dict with 6 elements with keys 'F', 'R', 'B', 'L', 'U', 'D' each of which is a numpy array in shape of 256 x 256.

    • Please refer to the source code if you still have any questions about the conversion between formats.

e2c(e_img, face_w=256, mode='bilinear', cube_format='dice')

Convert the given equirectangular to cubemap.
Parameters:

  • e_img: NDArray: Numpy array with shape [H, W, C].
  • face_w: int: The width of each cube face.
  • mode:str: See c2e.
  • cube_format:str: See c2e.

e2p(e_img, fov_deg, u_deg, v_deg, out_hw, in_rot_deg=0, mode='bilinear')

Take perspective image from given equirectangular. Parameters:

  • e_img: Numpy array with shape [H, W, C].
  • fov_deg: Field of view given in int or tuple (h_fov_deg, v_fov_deg).
  • u_deg: Horizontal viewing angle in range [-pi, pi]. (- Left / + Right).
  • v_deg: Vertical viewing angle in range [-pi/2, pi/2]. (- Down/ + Up).
  • out_hw: Output image (height, width) in tuple.
  • in_rot_deg: Inplane rotation.
  • mode: bilinear or nearest.

Example:

import numpy as np
from PIL import Image
import py360convert

cube_dice = np.array(Image.open('assets/demo_cube.png'))

# You can make conversion between supported cubemap format
cube_h = py360convert.cube_dice2h(cube_dice)  # the inverse is cube_h2dice
cube_dict = py360convert.cube_h2dict(cube_h)  # the inverse is cube_dict2h
cube_list = py360convert.cube_h2list(cube_h)  # the inverse is cube_list2h
print('cube_dice.shape:', cube_dice.shape)
print('cube_h.shape:', cube_h.shape)
print('cube_dict.keys():', cube_dict.keys())
print('cube_dict["F"].shape:', cube_dict["F"].shape)
print('len(cube_list):', len(cube_list))
print('cube_list[0].shape:', cube_list[0].shape)

Output:

cube_dice.shape: (768, 1024, 3)
cube_h.shape: (256, 1536, 3)
cube_dict.keys(): dict_keys(['F', 'R', 'B', 'L', 'U', 'D'])
cube_dict["F"].shape: (256, 256, 3)
len(cube_list): 6
cube_list[0].shape: (256, 256, 3)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py360convert-1.0.0.tar.gz (14.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py360convert-1.0.0-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

File details

Details for the file py360convert-1.0.0.tar.gz.

File metadata

  • Download URL: py360convert-1.0.0.tar.gz
  • Upload date:
  • Size: 14.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.5 CPython/3.11.4 Darwin/24.2.0

File hashes

Hashes for py360convert-1.0.0.tar.gz
Algorithm Hash digest
SHA256 a9202de8fee9aafced73aea62fc4f225ad0954671ae78cb5eee9ead2d457068c
MD5 66ecda21aa52e2f81a8c4785562cd49c
BLAKE2b-256 2b0d1f11bc41378ae90c9725b6eed9070eee2cd8bd74ece72190b3689034a291

See more details on using hashes here.

File details

Details for the file py360convert-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: py360convert-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 15.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.5 CPython/3.11.4 Darwin/24.2.0

File hashes

Hashes for py360convert-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9f2c1e94d7414c2062b423df5aeee9c225e9b5db4d44eac6b6c43db8c9322702
MD5 ae7a1827adb87baa8fc6d63ef97f03d0
BLAKE2b-256 851bc56fb26c8ccf22e083cd3b4a69dc9bf4cc2f6eccc2868cd10901c2f930e9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page