pytorch360convert


Namepytorch360convert JSON
Version 0.2.0 PyPI version JSON
download
home_pagehttps://github.com/ProGamerGov/pytorch360convert
Summary360 degree image manipulation and conversion utilities for PyTorch.
upload_time2025-01-26 20:58:24
maintainerNone
docs_urlNone
authorBen Egan
requires_python>=3.7
licenseMIT
keywords 360 degree equirectangular cubemap image processing pytorch photo sphere spherical photo vr photography pano 360 photo 360 perspective
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 📷 PyTorch 360° Image Conversion Toolkit

[![PyPI - Version](https://img.shields.io/pypi/v/pytorch360convert)](https://pypi.org/project/pytorch360convert/)


## Overview

This PyTorch-based library provides powerful and differentiable image transformation utilities for converting between different panoramic image formats:

- **Equirectangular (360°) Images** 
- **Cubemap Representations**
- **Perspective Projections**

Built as an improved PyTorch implementation of the original [py360convert](https://github.com/sunset1995/py360convert) project, this library offers flexible, CPU & GPU-accelerated functions.


<div align="left">
 <img src="https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/basic_equirectangular.png?raw=true" width="710px">
</div>

* Equirectangular format


<div align="left">
 <img src="https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/basic_dice_cubemap.png?raw=true" width="710px">
</div>

* Cubemap 'dice' format


## 🔧 Requirements

- Python 3.7+
- [PyTorch](https://pytorch.org/)


## 📦 Installation

You can easily install the library using pip:

```bash
pip install pytorch360convert
```

Or you can install it from source like this:

```bash
pip install torch
```

Then clone the repository:

```bash
git clone https://github.com/ProGamerGov/pytorch360convert.git
cd pytorch360convert
pip install .
```


## 🚀 Key Features

- Lossless conversion between image formats.
- Supports different cubemap input formats (horizon, list, stack, dict, dice).
- Configurable sampling modes (bilinear, nearest).
- Supports different dtypes (float16, float32, float64).
- CPU support.
- GPU acceleration.
- Differentiable transformations for deep learning pipelines.
- [TorchScript](https://pytorch.org/docs/stable/jit.html) (JIT) support.


## 💡 Usage Examples


### Helper Functions

First we'll setup some helper functions:

```bash
pip install torchvision pillow
```


```python
import torch
from torchvision.transforms import ToTensor, ToPILImage
from PIL import Image

def load_image_to_tensor(image_path: str) -> torch.Tensor:
    """Load an image as a PyTorch tensor."""
    return ToTensor()(Image.open(image_path).convert('RGB'))

def save_tensor_as_image(tensor: torch.Tensor, save_path: str) -> None:
    """Save a PyTorch tensor as an image."""
    ToPILImage()(tensor).save(save_path)

```

### Equirectangular to Cubemap Conversion

Converting equirectangular images into cubemaps is easy. For simplicity, we'll use the 'dice' format, which places all cube faces into a single 4x3 grid image.

```python
from pytorch360convert import e2c

# Load equirectangular image (3, 1376, 2752)
equi_image = load_image_to_tensor("examples/example_world_map_equirectangular.png")
face_w = equi_image.shape[2] // 4  # 2752 / 4 = 688

# Convert to cubemap (dice format)
cubemap = e2c(
    equi_image,                   # CHW format
    face_w=face_w,                # Width of each cube face
    mode='bilinear',              # Sampling interpolation
    cube_format='dice'            # Output cubemap layout
)

# Save cubemap faces
save_tensor_as_image(cubemap, "dice_cubemap.jpg")
```

| Equirectangular Input | Cubemap 'Dice' Output |
| :---: | :----: |
| ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_equirectangular.png?raw=true) | ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_dice_cubemap.png?raw=true) |

| Cubemap 'Horizon' Output |
| :---: |
| ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_horizon_cubemap.png?raw=true) |

### Cubemap to Equirectangular Conversion

We can also convert cubemaps into equirectangular images, like so.

```python
from pytorch360convert import c2e

# Load cubemap in 'dice' format
cubemap = load_image_to_tensor("dice_cubemap.jpg")

# Convert cubemap back to equirectangular
equirectangular = c2e(
    cubemap,              # Cubemap tensor(s)
    mode='bilinear',      # Sampling interpolation
    cube_format='dice'    # Input cubemap layout
)

save_tensor_as_image(equirectangular, "equirectangular.jpg")
```

### Equirectangular to Perspective Projection

```python
from pytorch360convert import e2p

# Load equirectangular input
equi_image = load_image_to_tensor("examples/example_world_map_equirectangular.png")

# Extract perspective view from equirectangular image
perspective_view = e2p(
    equi_image,                   # Equirectangular image
    fov_deg=(70, 60),             # Horizontal and vertical FOV
    h_deg=260,                    # Horizontal rotation
    v_deg=50,                     # Vertical rotation
    out_hw=(512, 768),            # Output image dimensions
    mode='bilinear'               # Sampling interpolation
)

save_tensor_as_image(perspective_view, "perspective.jpg")
```

| Equirectangular Input | Perspective Output |
| :---: | :----: |
| ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_equirectangular.png?raw=true) | ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_perspective.png?raw=true) |



### Equirectangular to Equirectangular

```python
from pytorch360convert import e2e

# Load equirectangular input
equi_image = load_image_to_tensor("examples/example_world_map_equirectangular.png")

# Rotate an equirectangular image around one more axes
rotated_equi = e2e(
    equi_image,                   # Equirectangular image
    h_deg=90.0,                   # Vertical rotation/shift
    v_deg=200.0,                  # Horizontal rotation/shift
    roll=45.0,                    # Clockwise/counter clockwise rotation
    mode='bilinear'               # Sampling interpolation
)

save_tensor_as_image(rotated_equi, "rotated.jpg")
```

| Equirectangular Input | Rotated Output |
| :---: | :----: |
| ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_equirectangular.png?raw=true) | ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_equirectangular_rotated.png?raw=true) |


## 📚 Basic Functions

### `e2c(e_img, face_w=256, mode='bilinear', cube_format='dice')`
Converts an equirectangular image to a cubemap projection.

- **Parameters**:
  - `e_img` (torch.Tensor): Equirectangular CHW image tensor.
  - `face_w` (int, optional): Cube face width. Default: `256`.
  - `mode` (str, optional): Sampling interpolation mode. Options are `bilinear`, `bicubic`, and `nearest`. Default: `bilinear`
  - `cube_format` (str, optional): The desired output cubemap format. Options are `dict`, `list`, `horizon`, `stack`, and `dice`. Default: `dice`
    - `stack` (torch.Tensor): Stack of 6 faces, in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].
    - `list` (list of torch.Tensor): List of 6 faces, in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].
    - `dict` (dict of torch.Tensor): Dictionary with keys pointing to face tensors. Keys are: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].
    - `dice` (torch.Tensor): A cubemap in a 'dice' layout.
    - `horizon` (torch.Tensor): A cubemap in a 'horizon' layout, a 1x6 grid in the order: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].
  - `channels_first` (bool, optional): Input cubemap channel format (CHW or HWC). Defaults to the PyTorch CHW standard of `True`.

- **Returns**: Cubemap representation of the input image as a tensor, list of tensors, or dict or tensors.

### `c2e(cubemap, h, w, mode='bilinear', cube_format='dice')`
Converts a cubemap projection to an equirectangular image.

- **Parameters**:
  - `cubemap` (torch.Tensor, list of torch.Tensor, or dict of torch.Tensor): Cubemap image tensor, list of tensors, or dict of tensors. Note that tensors should be in the shape of: `CHW`, except for when `cube_format = 'stack'`, in which case a batch dimension is present. Inputs should match the corresponding `cube_format`.
  - `h` (int, optional): Output image height. If set to None, `<cube_face_width> * 2` will be used. Default: `None`.
  - `w` (int, optional): Output image width. If set to None, `<cube_face_width> * 4` will be used. Default: `None`.
  - `mode` (str, optional): Sampling interpolation mode. Options are `bilinear`, `bicubic`, and `nearest`. Default: `bilinear`
  - `cube_format` (str, optional): Input cubemap format. Options are `dict`, `list`, `horizon`, `stack`, and `dice`. Default: `dice`
    - `stack` (torch.Tensor): Stack of 6 faces, in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].
    - `list` (list of torch.Tensor): List of 6 faces, in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].
    - `dict` (dict of torch.Tensor): Dictionary with keys pointing to face tensors. Keys are expected to be: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].
    - `dice` (torch.Tensor): A cubemap in a 'dice' layout.
    - `horizon` (torch.Tensor): A cubemap in a 'horizon' layout, a 1x6 grid in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].
  - `channels_first` (bool, optional): Input cubemap channel format (CHW or HWC). Defaults to the PyTorch CHW standard of `True`.
     
- **Returns**: Equirectangular projection of the input cubemap as a tensor.

### `e2p(e_img, fov_deg, h_deg, v_deg, out_hw, in_rot_deg=0, mode='bilinear')`
Extracts a perspective view from an equirectangular image.

- **Parameters**:
  - `e_img` (torch.Tensor): Equirectangular CHW or NCHW image tensor.
  - `fov_deg` (float or tuple of float): Field of view in degrees. If a single value is provided, it will be used for both horizontal and vertical degrees. If using a tuple, values are expected to be in following format: (h_fov_deg, v_fov_deg).
  - `h_deg` (float, optional): Horizontal viewing angle in range [-pi, pi]. (-Left/+Right). Default: `0.0`
  - `v_deg` (float, optional): Vertical viewing angle in range [-pi/2, pi/2]. (-Down/+Up). Default: `0.0`
  - `out_hw` (float or tuple of float, optional): Output image dimensions in the shape of '(height, width)'. Default: `(512, 512)`
  - `in_rot_deg` (float, optional): Inplane rotation angle. Default: `0`
  - `mode` (str, optional): Sampling interpolation mode. Options are `bilinear`, `bicubic`, and `nearest`. Default: `bilinear`
  - `channels_first` (bool, optional): Input cubemap channel format (CHW or HWC). Defaults to the PyTorch CHW standard of `True`.

- **Returns**: Perspective view of the equirectangular image as a tensor.

### `e2e(e_img, h_deg, v_deg, roll=0, mode='bilinear')`

Rotate an equirectangular image along one or more axes (roll, pitch, and yaw) to produce a horizontal shift, vertical shift, or to roll the image.

- **Parameters**:
  - `e_img` (torch.Tensor): Equirectangular CHW or NCHW image tensor.
  - `roll` (float, optional): Roll angle in degrees (-Counter_Clockwise/+Clockwise). Rotates the image along the x-axis. Default: `0.0`
  - `h_deg` (float, optional): Yaw angle in degrees (-Left/+Right). Rotates the image along the z-axis to produce a horizontal shift. Default: `0.0`
  - `v_deg` (float, optional): Pitch angle in degrees (-Down/+Up). Rotates the image along the y-axis to produce a vertical shift. Default: `0.0` 
  - `mode` (str, optional): Sampling interpolation mode. Options are `bilinear`, `bicubic`, and `nearest`. Default: `bilinear`
  - `channels_first` (bool, optional): Input cubemap channel format (CHW or HWC). Defaults to the PyTorch CHW standard of `True`.

- **Returns**: A modified equirectangular image tensor.


## 🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.


## 🔬 Citation

If you use this library in your research or project, please refer to the included [CITATION.cff](CITATION.cff) file or cite it as follows:

### BibTeX
```bibtex
@misc{egan2024pytorch360convert,
  title={PyTorch 360° Image Conversion Toolkit},
  author={Egan, Ben},
  year={2024},
  publisher={GitHub},
  howpublished={\url{https://github.com/ProGamerGov/pytorch360convert}}
}
```

### APA Style
```
Egan, B. (2024). PyTorch 360° Image Conversion Toolkit [Computer software]. GitHub. https://github.com/ProGamerGov/pytorch360convert
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ProGamerGov/pytorch360convert",
    "name": "pytorch360convert",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "360 degree, equirectangular, cubemap, image processing, PyTorch, photo sphere, spherical photo, vr photography, pano, 360 photo, 360, perspective",
    "author": "Ben Egan",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/3e/c0/d8a2b43f1f1dac23e083a949e8e6db2e667d0243da84be0242e4d190d4f4/pytorch360convert-0.2.0.tar.gz",
    "platform": null,
    "description": "# \ud83d\udcf7 PyTorch 360\u00b0 Image Conversion Toolkit\n\n[![PyPI - Version](https://img.shields.io/pypi/v/pytorch360convert)](https://pypi.org/project/pytorch360convert/)\n\n\n## Overview\n\nThis PyTorch-based library provides powerful and differentiable image transformation utilities for converting between different panoramic image formats:\n\n- **Equirectangular (360\u00b0) Images** \n- **Cubemap Representations**\n- **Perspective Projections**\n\nBuilt as an improved PyTorch implementation of the original [py360convert](https://github.com/sunset1995/py360convert) project, this library offers flexible, CPU & GPU-accelerated functions.\n\n\n<div align=\"left\">\n <img src=\"https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/basic_equirectangular.png?raw=true\" width=\"710px\">\n</div>\n\n* Equirectangular format\n\n\n<div align=\"left\">\n <img src=\"https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/basic_dice_cubemap.png?raw=true\" width=\"710px\">\n</div>\n\n* Cubemap 'dice' format\n\n\n## \ud83d\udd27 Requirements\n\n- Python 3.7+\n- [PyTorch](https://pytorch.org/)\n\n\n## \ud83d\udce6 Installation\n\nYou can easily install the library using pip:\n\n```bash\npip install pytorch360convert\n```\n\nOr you can install it from source like this:\n\n```bash\npip install torch\n```\n\nThen clone the repository:\n\n```bash\ngit clone https://github.com/ProGamerGov/pytorch360convert.git\ncd pytorch360convert\npip install .\n```\n\n\n## \ud83d\ude80 Key Features\n\n- Lossless conversion between image formats.\n- Supports different cubemap input formats (horizon, list, stack, dict, dice).\n- Configurable sampling modes (bilinear, nearest).\n- Supports different dtypes (float16, float32, float64).\n- CPU support.\n- GPU acceleration.\n- Differentiable transformations for deep learning pipelines.\n- [TorchScript](https://pytorch.org/docs/stable/jit.html) (JIT) support.\n\n\n## \ud83d\udca1 Usage Examples\n\n\n### Helper Functions\n\nFirst we'll setup some helper functions:\n\n```bash\npip install torchvision pillow\n```\n\n\n```python\nimport torch\nfrom torchvision.transforms import ToTensor, ToPILImage\nfrom PIL import Image\n\ndef load_image_to_tensor(image_path: str) -> torch.Tensor:\n    \"\"\"Load an image as a PyTorch tensor.\"\"\"\n    return ToTensor()(Image.open(image_path).convert('RGB'))\n\ndef save_tensor_as_image(tensor: torch.Tensor, save_path: str) -> None:\n    \"\"\"Save a PyTorch tensor as an image.\"\"\"\n    ToPILImage()(tensor).save(save_path)\n\n```\n\n### Equirectangular to Cubemap Conversion\n\nConverting equirectangular images into cubemaps is easy. For simplicity, we'll use the 'dice' format, which places all cube faces into a single 4x3 grid image.\n\n```python\nfrom pytorch360convert import e2c\n\n# Load equirectangular image (3, 1376, 2752)\nequi_image = load_image_to_tensor(\"examples/example_world_map_equirectangular.png\")\nface_w = equi_image.shape[2] // 4  # 2752 / 4 = 688\n\n# Convert to cubemap (dice format)\ncubemap = e2c(\n    equi_image,                   # CHW format\n    face_w=face_w,                # Width of each cube face\n    mode='bilinear',              # Sampling interpolation\n    cube_format='dice'            # Output cubemap layout\n)\n\n# Save cubemap faces\nsave_tensor_as_image(cubemap, \"dice_cubemap.jpg\")\n```\n\n| Equirectangular Input | Cubemap 'Dice' Output |\n| :---: | :----: |\n| ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_equirectangular.png?raw=true) | ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_dice_cubemap.png?raw=true) |\n\n| Cubemap 'Horizon' Output |\n| :---: |\n| ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_horizon_cubemap.png?raw=true) |\n\n### Cubemap to Equirectangular Conversion\n\nWe can also convert cubemaps into equirectangular images, like so.\n\n```python\nfrom pytorch360convert import c2e\n\n# Load cubemap in 'dice' format\ncubemap = load_image_to_tensor(\"dice_cubemap.jpg\")\n\n# Convert cubemap back to equirectangular\nequirectangular = c2e(\n    cubemap,              # Cubemap tensor(s)\n    mode='bilinear',      # Sampling interpolation\n    cube_format='dice'    # Input cubemap layout\n)\n\nsave_tensor_as_image(equirectangular, \"equirectangular.jpg\")\n```\n\n### Equirectangular to Perspective Projection\n\n```python\nfrom pytorch360convert import e2p\n\n# Load equirectangular input\nequi_image = load_image_to_tensor(\"examples/example_world_map_equirectangular.png\")\n\n# Extract perspective view from equirectangular image\nperspective_view = e2p(\n    equi_image,                   # Equirectangular image\n    fov_deg=(70, 60),             # Horizontal and vertical FOV\n    h_deg=260,                    # Horizontal rotation\n    v_deg=50,                     # Vertical rotation\n    out_hw=(512, 768),            # Output image dimensions\n    mode='bilinear'               # Sampling interpolation\n)\n\nsave_tensor_as_image(perspective_view, \"perspective.jpg\")\n```\n\n| Equirectangular Input | Perspective Output |\n| :---: | :----: |\n| ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_equirectangular.png?raw=true) | ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_perspective.png?raw=true) |\n\n\n\n### Equirectangular to Equirectangular\n\n```python\nfrom pytorch360convert import e2e\n\n# Load equirectangular input\nequi_image = load_image_to_tensor(\"examples/example_world_map_equirectangular.png\")\n\n# Rotate an equirectangular image around one more axes\nrotated_equi = e2e(\n    equi_image,                   # Equirectangular image\n    h_deg=90.0,                   # Vertical rotation/shift\n    v_deg=200.0,                  # Horizontal rotation/shift\n    roll=45.0,                    # Clockwise/counter clockwise rotation\n    mode='bilinear'               # Sampling interpolation\n)\n\nsave_tensor_as_image(rotated_equi, \"rotated.jpg\")\n```\n\n| Equirectangular Input | Rotated Output |\n| :---: | :----: |\n| ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_equirectangular.png?raw=true) | ![](https://github.com/ProGamerGov/pytorch360convert/raw/main/examples/example_world_map_equirectangular_rotated.png?raw=true) |\n\n\n## \ud83d\udcda Basic Functions\n\n### `e2c(e_img, face_w=256, mode='bilinear', cube_format='dice')`\nConverts an equirectangular image to a cubemap projection.\n\n- **Parameters**:\n  - `e_img` (torch.Tensor): Equirectangular CHW image tensor.\n  - `face_w` (int, optional): Cube face width. Default: `256`.\n  - `mode` (str, optional): Sampling interpolation mode. Options are `bilinear`, `bicubic`, and `nearest`. Default: `bilinear`\n  - `cube_format` (str, optional): The desired output cubemap format. Options are `dict`, `list`, `horizon`, `stack`, and `dice`. Default: `dice`\n    - `stack` (torch.Tensor): Stack of 6 faces, in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].\n    - `list` (list of torch.Tensor): List of 6 faces, in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].\n    - `dict` (dict of torch.Tensor): Dictionary with keys pointing to face tensors. Keys are: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].\n    - `dice` (torch.Tensor): A cubemap in a 'dice' layout.\n    - `horizon` (torch.Tensor): A cubemap in a 'horizon' layout, a 1x6 grid in the order: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].\n  - `channels_first` (bool, optional): Input cubemap channel format (CHW or HWC). Defaults to the PyTorch CHW standard of `True`.\n\n- **Returns**: Cubemap representation of the input image as a tensor, list of tensors, or dict or tensors.\n\n### `c2e(cubemap, h, w, mode='bilinear', cube_format='dice')`\nConverts a cubemap projection to an equirectangular image.\n\n- **Parameters**:\n  - `cubemap` (torch.Tensor, list of torch.Tensor, or dict of torch.Tensor): Cubemap image tensor, list of tensors, or dict of tensors. Note that tensors should be in the shape of: `CHW`, except for when `cube_format = 'stack'`, in which case a batch dimension is present. Inputs should match the corresponding `cube_format`.\n  - `h` (int, optional): Output image height. If set to None, `<cube_face_width> * 2` will be used. Default: `None`.\n  - `w` (int, optional): Output image width. If set to None, `<cube_face_width> * 4` will be used. Default: `None`.\n  - `mode` (str, optional): Sampling interpolation mode. Options are `bilinear`, `bicubic`, and `nearest`. Default: `bilinear`\n  - `cube_format` (str, optional): Input cubemap format. Options are `dict`, `list`, `horizon`, `stack`, and `dice`. Default: `dice`\n    - `stack` (torch.Tensor): Stack of 6 faces, in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].\n    - `list` (list of torch.Tensor): List of 6 faces, in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].\n    - `dict` (dict of torch.Tensor): Dictionary with keys pointing to face tensors. Keys are expected to be: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].\n    - `dice` (torch.Tensor): A cubemap in a 'dice' layout.\n    - `horizon` (torch.Tensor): A cubemap in a 'horizon' layout, a 1x6 grid in the order of: ['Front', 'Right', 'Back', 'Left', 'Up', 'Down'].\n  - `channels_first` (bool, optional): Input cubemap channel format (CHW or HWC). Defaults to the PyTorch CHW standard of `True`.\n     \n- **Returns**: Equirectangular projection of the input cubemap as a tensor.\n\n### `e2p(e_img, fov_deg, h_deg, v_deg, out_hw, in_rot_deg=0, mode='bilinear')`\nExtracts a perspective view from an equirectangular image.\n\n- **Parameters**:\n  - `e_img` (torch.Tensor): Equirectangular CHW or NCHW image tensor.\n  - `fov_deg` (float or tuple of float): Field of view in degrees. If a single value is provided, it will be used for both horizontal and vertical degrees. If using a tuple, values are expected to be in following format: (h_fov_deg, v_fov_deg).\n  - `h_deg` (float, optional): Horizontal viewing angle in range [-pi, pi]. (-Left/+Right). Default: `0.0`\n  - `v_deg` (float, optional): Vertical viewing angle in range [-pi/2, pi/2]. (-Down/+Up). Default: `0.0`\n  - `out_hw` (float or tuple of float, optional): Output image dimensions in the shape of '(height, width)'. Default: `(512, 512)`\n  - `in_rot_deg` (float, optional): Inplane rotation angle. Default: `0`\n  - `mode` (str, optional): Sampling interpolation mode. Options are `bilinear`, `bicubic`, and `nearest`. Default: `bilinear`\n  - `channels_first` (bool, optional): Input cubemap channel format (CHW or HWC). Defaults to the PyTorch CHW standard of `True`.\n\n- **Returns**: Perspective view of the equirectangular image as a tensor.\n\n### `e2e(e_img, h_deg, v_deg, roll=0, mode='bilinear')`\n\nRotate an equirectangular image along one or more axes (roll, pitch, and yaw) to produce a horizontal shift, vertical shift, or to roll the image.\n\n- **Parameters**:\n  - `e_img` (torch.Tensor): Equirectangular CHW or NCHW image tensor.\n  - `roll` (float, optional): Roll angle in degrees (-Counter_Clockwise/+Clockwise). Rotates the image along the x-axis. Default: `0.0`\n  - `h_deg` (float, optional): Yaw angle in degrees (-Left/+Right). Rotates the image along the z-axis to produce a horizontal shift. Default: `0.0`\n  - `v_deg` (float, optional): Pitch angle in degrees (-Down/+Up). Rotates the image along the y-axis to produce a vertical shift. Default: `0.0` \n  - `mode` (str, optional): Sampling interpolation mode. Options are `bilinear`, `bicubic`, and `nearest`. Default: `bilinear`\n  - `channels_first` (bool, optional): Input cubemap channel format (CHW or HWC). Defaults to the PyTorch CHW standard of `True`.\n\n- **Returns**: A modified equirectangular image tensor.\n\n\n## \ud83e\udd1d Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n\n## \ud83d\udd2c Citation\n\nIf you use this library in your research or project, please refer to the included [CITATION.cff](CITATION.cff) file or cite it as follows:\n\n### BibTeX\n```bibtex\n@misc{egan2024pytorch360convert,\n  title={PyTorch 360\u00b0 Image Conversion Toolkit},\n  author={Egan, Ben},\n  year={2024},\n  publisher={GitHub},\n  howpublished={\\url{https://github.com/ProGamerGov/pytorch360convert}}\n}\n```\n\n### APA Style\n```\nEgan, B. (2024). PyTorch 360\u00b0 Image Conversion Toolkit [Computer software]. GitHub. https://github.com/ProGamerGov/pytorch360convert\n```\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "360 degree image manipulation and conversion utilities for PyTorch.",
    "version": "0.2.0",
    "project_urls": {
        "Homepage": "https://github.com/ProGamerGov/pytorch360convert"
    },
    "split_keywords": [
        "360 degree",
        " equirectangular",
        " cubemap",
        " image processing",
        " pytorch",
        " photo sphere",
        " spherical photo",
        " vr photography",
        " pano",
        " 360 photo",
        " 360",
        " perspective"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a132d250d5c7f521653647689b93fc24c59bd7de2bb2c16910f8f04c85323139",
                "md5": "bfc1692e9f78b1968fa0d5143e499bb4",
                "sha256": "d1eb5fc72ca3e3b2efa368fd06d6327c6dde0acb1e127dc91e7c23e83e3674d2"
            },
            "downloads": -1,
            "filename": "pytorch360convert-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "bfc1692e9f78b1968fa0d5143e499bb4",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 14386,
            "upload_time": "2025-01-26T20:58:22",
            "upload_time_iso_8601": "2025-01-26T20:58:22.864982Z",
            "url": "https://files.pythonhosted.org/packages/a1/32/d250d5c7f521653647689b93fc24c59bd7de2bb2c16910f8f04c85323139/pytorch360convert-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3ec0d8a2b43f1f1dac23e083a949e8e6db2e667d0243da84be0242e4d190d4f4",
                "md5": "4031339a5341ef5eebdcc99e6133528a",
                "sha256": "012a726cbd93c96192286012a99a709d13afa0e12dacee0623831342b2e337dc"
            },
            "downloads": -1,
            "filename": "pytorch360convert-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "4031339a5341ef5eebdcc99e6133528a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 25092,
            "upload_time": "2025-01-26T20:58:24",
            "upload_time_iso_8601": "2025-01-26T20:58:24.126876Z",
            "url": "https://files.pythonhosted.org/packages/3e/c0/d8a2b43f1f1dac23e083a949e8e6db2e667d0243da84be0242e4d190d4f4/pytorch360convert-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-01-26 20:58:24",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ProGamerGov",
    "github_project": "pytorch360convert",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "pytorch360convert"
}
        
Elapsed time: 0.43186s