A Python package for panoramic image projection and blending using Gnomonic (and other) projections.
Project description
Panorai
Panorai is a Python package for spherical (360°) image processing, specifically focusing on sampling, projection, forward/backward transformations, and unsharp masking for panoramic or spherical data. It provides a modular pipeline to handle various steps, including:
- Resizing input images
- Sampling tangent points on a sphere (e.g., cube-based, Fibonacci-based)
- Projecting spherical images into local tangential (rectilinear) planes
- Re-projecting these rectilinear images back into the equirectangular space
- Configuring and applying unsharp masking to sharpen the projected images
- Logging and comparing configuration results (e.g., MSE) via an automated test suite
This README will guide you through the repository structure, installation, usage, and testing of Panorai.
Table of Contents
- Overview
- Directory Structure
- Installation
- Examples
- Key Modules and Classes
- Running Tests
- Extending Panorai
- License
Overview
Panorai is a Python library designed for advanced geometric transformations, projections, and sampling on spherical and equirectangular data. It provides a highly modular framework for implementing gnomonic projections, backward projections, and blending strategies, suitable for 360-degree image processing and panoramic data transformations.
Directory Structure
/
├── panorai/
│ ├── __pycache__/
│ ├── common/
│ │ ├── __pycache__/
│ │ ├── __init__.py
│ │ └── shared_config.py
│ ├── pipeline/
│ │ ├── __pycache__/
│ │ ├── utils/
│ │ │ ├── __pycache__/
│ │ │ ├── __init__.py
│ │ │ └── resizer.py
│ │ ├── __init__.py
│ │ ├── pipeline.py
│ │ ├── pipeline_data.py
│ │ └── pipeline_old.py
│ ├── projection/
│ │ ├── __pycache__/
│ │ ├── utils/
│ │ │ ├── __pycache__/
│ │ │ ├── __init__.py
│ │ │ ├── remapper.py
│ │ │ └── unsharp.py
│ │ ├── __init__.py
│ │ ├── projector.py
│ │ └── projector_deprecated.py
│ ├── readme/
│ │ └── gnomonic.md
│ ├── sampler/
│ │ ├── __pycache__/
│ │ ├── __init__.py
│ │ └── sampler.py
│ ├── __init__.py
├── panorai.egg-info/
│ ├── dependency_links.txt
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ └── top_level.txt
├── tests/
│ ├── __pycache__/
│ └── test_config_params.py
├── .gitignore
├── best_configs_chart.png
├── requirements.txt
├── setup.py
└── test_results.db
Notable Contents
-
panorai/
Main package directory containing submodules:- pipeline/: The pipeline logic for forward/backward projection and data handling, plus utility functions like
resizer. - projection/: Projector classes (e.g.,
GnomonicProjector) and remapping/unsharp utility code. - sampler/: Sphere sampling strategies (cube, icosahedron, Fibonacci).
- readme/: Additional notes/documentation (e.g., gnomonic.md).
- pipeline/: The pipeline logic for forward/backward projection and data handling, plus utility functions like
-
setup.py
A setuptools-based installation script. -
requirements.txt
Lists dependencies needed to run the code (e.g., NumPy, OpenCV, etc.).
Installation
-
Clone the Repository:
git clone https://github.com/yourusername/panorai.git cd panorai
-
Install Dependencies:
pip install -r requirements.txt
-
Install Panorai (Editable Mode or Standard):
pip install -e . # or python setup.py install
Examples
1. Data Preparation
Start by loading your input data, typically stored in an .npz file containing rgb, depth, and other channels.
import numpy as np
from panorai.pipeline.pipeline_data import PipelineData
# Load data from an NPZ file
filename = 'path/to/sample.npz' # Replace with your file path
arr = np.load(filename)
rgb = arr['rgb'] # Shape: (H, W, 3)
depth = np.sqrt(np.sum(arr['z']**2, axis=-1))[:, :, None] # Shape: (H, W, 1)
xyz = arr['z'] # Shape: (H, W, 3)
# Create a PipelineData instance
data = PipelineData.from_dict({
"rgb": rgb,
"depth": depth,
"xyz_depth": xyz
})
2. Preprocessing Data
Adjust for shadow angle and optionally rotate the equirectangular image:
from panorai.pipeline.utils.preprocess_eq import PreprocessEquirectangularImage
# Visualize the original data
import matplotlib.pyplot as plt
plt.imshow(data.data['rgb'])
plt.show()
# Preprocess the data (e.g., handle shadow angle)
data.preprocess(shadow_angle=30)
plt.imshow(data.data['rgb'])
plt.show()
3. Using Projections
3.1. Forward Projection
Project equirectangular data into a gnomonic projection.
from panorai.submodules.projections import ProjectionRegistry
# Access the gnomonic projection
proj = ProjectionRegistry.get_projection('gnomonic', return_processor=True)
# Perform forward projection
face = proj.forward(data.data['rgb'])
plt.imshow(face)
plt.show()
3.2. Backward Projection
Reconstruct the equirectangular image from a projection:
# Perform backward projection
eq_img = proj.backward(face)
plt.imshow(eq_img)
plt.show()
4. Using the ProjectionPipeline
The ProjectionPipeline provides a high-level API for projections.
from panorai.pipeline.pipeline import ProjectionPipeline
# Initialize the pipeline
pipe = ProjectionPipeline(projection_name='gnomonic')
# Forward projection
face = pipe.project(data)
plt.imshow(face['rgb'].astype(np.uint8))
plt.show()
4.1. Using Samplers
Use samplers to generate multiple projections (e.g., cube or icosahedron samplers):
pipe = ProjectionPipeline(projection_name='gnomonic', sampler_name='CubeSampler')
faces = pipe.project(data)
# Visualize a specific face
plt.imshow(faces['point_1']['rgb'].astype(np.uint8))
plt.show()
4.2. Blending Projections
Blend multiple projections into a seamless equirectangular image:
# Reconstruct equirectangular image
reconstructed = pipe.backward(faces)
plt.imshow(reconstructed['stacked'])
plt.show()
4.3. Custom Configurations
Modify the pipeline configuration to customize the behavior:
pipe = ProjectionPipeline(projection_name='gnomonic', sampler_name='IcosahedronSampler')
faces = pipe.project(data, subdivisions=2, fov_deg=40)
reconstructed = pipe.backward(faces)
plt.imshow(reconstructed['stacked'])
plt.show()
Key Modules and Classes
-
PipelineData
A container for storing and stacking multiple image channels (e.g.,rgb,depth). -
ProjectionPipeline
Manages the forward/backward transformations using a chosen sampler and projector. -
Samplers
- CubeSampler: Tangent points for cube-based projections.
- IcosahedronSampler: Icosahedron-based tangent points.
- FibonacciSampler: Fibonacci sphere sampling for uniform distribution.
-
ProjectionRegistry
- Project that implements the projection modules https://github.com/RobinsonGarcia/projections/tree/main
Extending Panorai
- Add new samplers: Implement a new class inheriting from
Samplerand register it inSAMPLER_CLASSES. - Add new projectors: Implement a new class inheriting from
ProjectionStrategyand add it toPROJECTOR_CLASSES. - HF integration to handle depth estimation: Implement seamless integration with HF to load and run DA inference
License
This project is licensed under the MIT License. See the LICENSE file for details.
Contact
For questions or feedback, contact the maintainers:
- Your Name: rlsgarcia@icloud.com
- GitHub: https://github.com/RobinsonGarcia
Enjoy using Panorai for your panoramic image processing!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file panorai-1.4.2.tar.gz.
File metadata
- Download URL: panorai-1.4.2.tar.gz
- Upload date:
- Size: 29.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
034a69362f8ec5c5173f19dcf09b6c92a7d839caca9bad89aa49d495ec60fe2e
|
|
| MD5 |
5fe6f30d84a47f5235ec5ff685b97ae5
|
|
| BLAKE2b-256 |
457db39ef2cd606b2e1796b5ede59941ae3debe9f696ad7e122e42e5b37fbfe5
|
Provenance
The following attestation bundles were made for panorai-1.4.2.tar.gz:
Publisher:
python-publish.yml on RobinsonGarcia/PanorAi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
panorai-1.4.2.tar.gz -
Subject digest:
034a69362f8ec5c5173f19dcf09b6c92a7d839caca9bad89aa49d495ec60fe2e - Sigstore transparency entry: 171926864
- Sigstore integration time:
-
Permalink:
RobinsonGarcia/PanorAi@2b46cf69febf0bb58d9f03d6acd17b88106cdf7f -
Branch / Tag:
refs/tags/v1.4.2 - Owner: https://github.com/RobinsonGarcia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@2b46cf69febf0bb58d9f03d6acd17b88106cdf7f -
Trigger Event:
release
-
Statement type:
File details
Details for the file panorai-1.4.2-py3-none-any.whl.
File metadata
- Download URL: panorai-1.4.2-py3-none-any.whl
- Upload date:
- Size: 31.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5db230ef1bfb643779dc693be61dc962a3917142c5ec29f18247c3b7158579cd
|
|
| MD5 |
c539401b51b62a536ce9a5b41342e7fc
|
|
| BLAKE2b-256 |
cac1f8fdf9ebe31cbeda44ae3b8df38726ec26a9c7b67d47c191b7bc255e8e84
|
Provenance
The following attestation bundles were made for panorai-1.4.2-py3-none-any.whl:
Publisher:
python-publish.yml on RobinsonGarcia/PanorAi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
panorai-1.4.2-py3-none-any.whl -
Subject digest:
5db230ef1bfb643779dc693be61dc962a3917142c5ec29f18247c3b7158579cd - Sigstore transparency entry: 171926868
- Sigstore integration time:
-
Permalink:
RobinsonGarcia/PanorAi@2b46cf69febf0bb58d9f03d6acd17b88106cdf7f -
Branch / Tag:
refs/tags/v1.4.2 - Owner: https://github.com/RobinsonGarcia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@2b46cf69febf0bb58d9f03d6acd17b88106cdf7f -
Trigger Event:
release
-
Statement type: