ImageStacking šĀ¶
This notebook aims to explore the purpose of Image Stacking and observe how capturing multiple short exposures is advantegeous than one single exposure for Astrophotography.
Author: Timothy Do
References¶
[1] PhotographingSpace.com. (2023, December 22). Homework: Download and Stack my Data! [Online]. Available: https://www.photographingspace.com/homework-download-stack-data/
[2] Ethan Rublee, Vincent Rabaud, Kurt Konolige, and Gary Bradski. ORB: an efficient alternative to SIFT or SURF. In 2011 IEEE International Conference on Computer Vision (ICCV), 1 pages 2564ā2571. IEEE, 2011.
[3] AstroBackyard.com. (2024). Deep Sky Stacker Tutorial Practice Files. [Online]. Available: https://astrobackyard.com/dss-practice-files/
Dependencies¶
IN_COLAB = True
try:
import google.colab
except:
IN_COLAB = False
print(f'In CoLab: {IN_COLAB}')
In CoLab: False
if(IN_COLAB):
!curl https://raw.githubusercontent.com/dotimothy/astronomy/main/requirements.txt -o ./requirements.txt
!pip install -r requirements.txt
else:
!pip install -r ../requirements.txt
Requirement already satisfied: opencv-python in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 2)) (4.10.0.84) Requirement already satisfied: pillow in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 3)) (11.0.0) Requirement already satisfied: exifread in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 4)) (3.0.0) Requirement already satisfied: matplotlib in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 5)) (3.9.2) Requirement already satisfied: numpy in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 6)) (1.26.4) Requirement already satisfied: rawpy in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 7)) (0.24.0) Requirement already satisfied: tqdm in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 8)) (4.67.0) Requirement already satisfied: jupyter in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 9)) (1.1.1) Requirement already satisfied: torch in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 10)) (2.5.1) Requirement already satisfied: h5py in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 11)) (3.12.1) Requirement already satisfied: pandas in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 12)) (2.2.3) Requirement already satisfied: xarray in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 13)) (2024.7.0) Requirement already satisfied: earthaccess in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 14)) (0.11.0) Requirement already satisfied: gdown in /Users/tim/env/lib/python3.9/site-packages (from -r ../requirements.txt (line 15)) (5.2.0) Requirement already satisfied: contourpy>=1.0.1 in /Users/tim/env/lib/python3.9/site-packages (from matplotlib->-r ../requirements.txt (line 5)) (1.3.0) Requirement already satisfied: cycler>=0.10 in /Users/tim/env/lib/python3.9/site-packages (from matplotlib->-r ../requirements.txt (line 5)) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /Users/tim/env/lib/python3.9/site-packages (from matplotlib->-r ../requirements.txt (line 5)) (4.55.0) Requirement already satisfied: kiwisolver>=1.3.1 in /Users/tim/env/lib/python3.9/site-packages (from matplotlib->-r ../requirements.txt (line 5)) (1.4.7) Requirement already satisfied: packaging>=20.0 in /Users/tim/env/lib/python3.9/site-packages (from matplotlib->-r ../requirements.txt (line 5)) (24.2) Requirement already satisfied: pyparsing>=2.3.1 in /Users/tim/env/lib/python3.9/site-packages (from matplotlib->-r ../requirements.txt (line 5)) (3.2.0) Requirement already satisfied: python-dateutil>=2.7 in /Users/tim/env/lib/python3.9/site-packages (from matplotlib->-r ../requirements.txt (line 5)) (2.9.0.post0) Requirement already satisfied: importlib-resources>=3.2.0 in /Users/tim/env/lib/python3.9/site-packages (from matplotlib->-r ../requirements.txt (line 5)) (6.4.5) Requirement already satisfied: notebook in /Users/tim/env/lib/python3.9/site-packages (from jupyter->-r ../requirements.txt (line 9)) (7.2.2) Requirement already satisfied: jupyter-console in /Users/tim/env/lib/python3.9/site-packages (from jupyter->-r ../requirements.txt (line 9)) (6.6.3) Requirement already satisfied: nbconvert in /Users/tim/env/lib/python3.9/site-packages (from jupyter->-r ../requirements.txt (line 9)) (7.16.4) Requirement already satisfied: ipykernel in /Users/tim/env/lib/python3.9/site-packages (from jupyter->-r ../requirements.txt (line 9)) (6.29.5) Requirement already satisfied: ipywidgets in /Users/tim/env/lib/python3.9/site-packages (from jupyter->-r ../requirements.txt (line 9)) (8.1.5) Requirement already satisfied: jupyterlab in /Users/tim/env/lib/python3.9/site-packages (from jupyter->-r ../requirements.txt (line 9)) (4.2.6) Requirement already satisfied: filelock in /Users/tim/env/lib/python3.9/site-packages (from torch->-r ../requirements.txt (line 10)) (3.16.1) Requirement already satisfied: typing-extensions>=4.8.0 in /Users/tim/env/lib/python3.9/site-packages (from torch->-r ../requirements.txt (line 10)) (4.12.2) Requirement already satisfied: networkx in /Users/tim/env/lib/python3.9/site-packages (from torch->-r ../requirements.txt (line 10)) (3.2.1) Requirement already satisfied: jinja2 in /Users/tim/env/lib/python3.9/site-packages (from torch->-r ../requirements.txt (line 10)) (3.1.4) Requirement already satisfied: fsspec in /Users/tim/env/lib/python3.9/site-packages (from torch->-r ../requirements.txt (line 10)) (2024.12.0) Requirement already satisfied: sympy==1.13.1 in /Users/tim/env/lib/python3.9/site-packages (from torch->-r ../requirements.txt (line 10)) (1.13.1) Requirement already satisfied: mpmath<1.4,>=1.1.0 in /Users/tim/env/lib/python3.9/site-packages (from sympy==1.13.1->torch->-r ../requirements.txt (line 10)) (1.3.0) Requirement already satisfied: pytz>=2020.1 in /Users/tim/env/lib/python3.9/site-packages (from pandas->-r ../requirements.txt (line 12)) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /Users/tim/env/lib/python3.9/site-packages (from pandas->-r ../requirements.txt (line 12)) (2024.2) Requirement already satisfied: multimethod>=1.8 in /Users/tim/env/lib/python3.9/site-packages (from earthaccess->-r ../requirements.txt (line 14)) (1.12) Requirement already satisfied: pqdm>=0.1 in /Users/tim/env/lib/python3.9/site-packages (from earthaccess->-r ../requirements.txt (line 14)) (0.2.0) Requirement already satisfied: python-cmr>=0.10.0 in /Users/tim/env/lib/python3.9/site-packages (from earthaccess->-r ../requirements.txt (line 14)) (0.13.0) Requirement already satisfied: requests>=2.26 in /Users/tim/env/lib/python3.9/site-packages (from earthaccess->-r ../requirements.txt (line 14)) (2.32.3) Requirement already satisfied: s3fs>=2022.11 in /Users/tim/env/lib/python3.9/site-packages (from earthaccess->-r ../requirements.txt (line 14)) (2024.12.0) Requirement already satisfied: tinynetrc>=1.3.1 in /Users/tim/env/lib/python3.9/site-packages (from earthaccess->-r ../requirements.txt (line 14)) (1.3.1) Requirement already satisfied: beautifulsoup4 in /Users/tim/env/lib/python3.9/site-packages (from gdown->-r ../requirements.txt (line 15)) (4.12.3) Requirement already satisfied: zipp>=3.1.0 in /Users/tim/env/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib->-r ../requirements.txt (line 5)) (3.21.0) Requirement already satisfied: bounded-pool-executor in /Users/tim/env/lib/python3.9/site-packages (from pqdm>=0.1->earthaccess->-r ../requirements.txt (line 14)) (0.0.3) Requirement already satisfied: six>=1.5 in /Users/tim/env/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib->-r ../requirements.txt (line 5)) (1.16.0) Requirement already satisfied: charset-normalizer<4,>=2 in /Users/tim/env/lib/python3.9/site-packages (from requests>=2.26->earthaccess->-r ../requirements.txt (line 14)) (3.4.0) Requirement already satisfied: idna<4,>=2.5 in /Users/tim/env/lib/python3.9/site-packages (from requests>=2.26->earthaccess->-r ../requirements.txt (line 14)) (3.7) Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/tim/env/lib/python3.9/site-packages (from requests>=2.26->earthaccess->-r ../requirements.txt (line 14)) (1.26.20) Requirement already satisfied: certifi>=2017.4.17 in /Users/tim/env/lib/python3.9/site-packages (from requests>=2.26->earthaccess->-r ../requirements.txt (line 14)) (2024.8.30) Requirement already satisfied: aiobotocore<3.0.0,>=2.5.4 in /Users/tim/env/lib/python3.9/site-packages (from s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (2.16.0) Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /Users/tim/env/lib/python3.9/site-packages (from s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (3.11.11) Requirement already satisfied: soupsieve>1.2 in /Users/tim/env/lib/python3.9/site-packages (from beautifulsoup4->gdown->-r ../requirements.txt (line 15)) (2.6) Requirement already satisfied: appnope in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (0.1.4) Requirement already satisfied: comm>=0.1.1 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (0.2.2) Requirement already satisfied: debugpy>=1.6.5 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (1.8.8) Requirement already satisfied: ipython>=7.23.1 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (8.18.1) Requirement already satisfied: jupyter-client>=6.1.12 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (8.6.3) Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (5.7.2) Requirement already satisfied: matplotlib-inline>=0.1 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (0.1.7) Requirement already satisfied: nest-asyncio in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (1.6.0) Requirement already satisfied: psutil in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (6.1.0) Requirement already satisfied: pyzmq>=24 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (26.2.0) Requirement already satisfied: tornado>=6.1 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (6.4.1) Requirement already satisfied: traitlets>=5.4.0 in /Users/tim/env/lib/python3.9/site-packages (from ipykernel->jupyter->-r ../requirements.txt (line 9)) (5.14.3) Requirement already satisfied: widgetsnbextension~=4.0.12 in /Users/tim/env/lib/python3.9/site-packages (from ipywidgets->jupyter->-r ../requirements.txt (line 9)) (4.0.13) Requirement already satisfied: jupyterlab-widgets~=3.0.12 in /Users/tim/env/lib/python3.9/site-packages (from ipywidgets->jupyter->-r ../requirements.txt (line 9)) (3.0.13) Requirement already satisfied: MarkupSafe>=2.0 in /Users/tim/env/lib/python3.9/site-packages (from jinja2->torch->-r ../requirements.txt (line 10)) (2.1.5) Requirement already satisfied: prompt-toolkit>=3.0.30 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-console->jupyter->-r ../requirements.txt (line 9)) (3.0.48) Requirement already satisfied: pygments in /Users/tim/env/lib/python3.9/site-packages (from jupyter-console->jupyter->-r ../requirements.txt (line 9)) (2.18.0) Requirement already satisfied: async-lru>=1.0.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.0.4) Requirement already satisfied: httpx>=0.25.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.27.2) Requirement already satisfied: importlib-metadata>=4.8.3 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (8.5.0) Requirement already satisfied: jupyter-lsp>=2.0.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.2.5) Requirement already satisfied: jupyter-server<3,>=2.4.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.14.2) Requirement already satisfied: jupyterlab-server<3,>=2.27.1 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.27.3) Requirement already satisfied: notebook-shim>=0.2 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.2.4) Requirement already satisfied: setuptools>=40.1.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (74.1.2) Requirement already satisfied: tomli>=1.2.2 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.1.0) Requirement already satisfied: bleach!=5.0.0 in /Users/tim/env/lib/python3.9/site-packages (from nbconvert->jupyter->-r ../requirements.txt (line 9)) (6.2.0) Requirement already satisfied: defusedxml in /Users/tim/env/lib/python3.9/site-packages (from nbconvert->jupyter->-r ../requirements.txt (line 9)) (0.7.1) Requirement already satisfied: jupyterlab-pygments in /Users/tim/env/lib/python3.9/site-packages (from nbconvert->jupyter->-r ../requirements.txt (line 9)) (0.3.0) Requirement already satisfied: mistune<4,>=2.0.3 in /Users/tim/env/lib/python3.9/site-packages (from nbconvert->jupyter->-r ../requirements.txt (line 9)) (3.0.2) Requirement already satisfied: nbclient>=0.5.0 in /Users/tim/env/lib/python3.9/site-packages (from nbconvert->jupyter->-r ../requirements.txt (line 9)) (0.10.0) Requirement already satisfied: nbformat>=5.7 in /Users/tim/env/lib/python3.9/site-packages (from nbconvert->jupyter->-r ../requirements.txt (line 9)) (5.10.4) Requirement already satisfied: pandocfilters>=1.4.1 in /Users/tim/env/lib/python3.9/site-packages (from nbconvert->jupyter->-r ../requirements.txt (line 9)) (1.5.1) Requirement already satisfied: tinycss2 in /Users/tim/env/lib/python3.9/site-packages (from nbconvert->jupyter->-r ../requirements.txt (line 9)) (1.4.0) Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /Users/tim/env/lib/python3.9/site-packages (from requests[socks]->gdown->-r ../requirements.txt (line 15)) (1.7.1) Requirement already satisfied: botocore<1.35.82,>=1.35.74 in /Users/tim/env/lib/python3.9/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (1.35.81) Requirement already satisfied: wrapt<2.0.0,>=1.10.10 in /Users/tim/env/lib/python3.9/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (1.17.0) Requirement already satisfied: aioitertools<1.0.0,>=0.5.1 in /Users/tim/env/lib/python3.9/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (0.12.0) Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /Users/tim/env/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (2.4.4) Requirement already satisfied: aiosignal>=1.1.2 in /Users/tim/env/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (1.3.2) Requirement already satisfied: async-timeout<6.0,>=4.0 in /Users/tim/env/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (5.0.1) Requirement already satisfied: attrs>=17.3.0 in /Users/tim/env/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (24.2.0) Requirement already satisfied: frozenlist>=1.1.1 in /Users/tim/env/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (1.5.0) Requirement already satisfied: multidict<7.0,>=4.5 in /Users/tim/env/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (6.1.0) Requirement already satisfied: propcache>=0.2.0 in /Users/tim/env/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (0.2.1) Requirement already satisfied: yarl<2.0,>=1.17.0 in /Users/tim/env/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (1.18.3) Requirement already satisfied: webencodings in /Users/tim/env/lib/python3.9/site-packages (from bleach!=5.0.0->nbconvert->jupyter->-r ../requirements.txt (line 9)) (0.5.1) Requirement already satisfied: anyio in /Users/tim/env/lib/python3.9/site-packages (from httpx>=0.25.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (4.6.2.post1) Requirement already satisfied: httpcore==1.* in /Users/tim/env/lib/python3.9/site-packages (from httpx>=0.25.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (1.0.7) Requirement already satisfied: sniffio in /Users/tim/env/lib/python3.9/site-packages (from httpx>=0.25.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (1.3.1) Requirement already satisfied: h11<0.15,>=0.13 in /Users/tim/env/lib/python3.9/site-packages (from httpcore==1.*->httpx>=0.25.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.14.0) Requirement already satisfied: decorator in /Users/tim/env/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (5.1.1) Requirement already satisfied: jedi>=0.16 in /Users/tim/env/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (0.19.2) Requirement already satisfied: stack-data in /Users/tim/env/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (0.6.3) Requirement already satisfied: exceptiongroup in /Users/tim/env/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (1.2.2) Requirement already satisfied: pexpect>4.3 in /Users/tim/env/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (4.9.0) Requirement already satisfied: platformdirs>=2.5 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel->jupyter->-r ../requirements.txt (line 9)) (4.3.6) Requirement already satisfied: argon2-cffi>=21.1 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (23.1.0) Requirement already satisfied: jupyter-events>=0.9.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.10.0) Requirement already satisfied: jupyter-server-terminals>=0.4.4 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.5.3) Requirement already satisfied: overrides>=5.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (7.7.0) Requirement already satisfied: prometheus-client>=0.9 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.21.0) Requirement already satisfied: send2trash>=1.8.2 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (1.8.3) Requirement already satisfied: terminado>=0.8.3 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.18.1) Requirement already satisfied: websocket-client>=1.7 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (1.8.0) Requirement already satisfied: babel>=2.10 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.16.0) Requirement already satisfied: json5>=0.9.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.9.28) Requirement already satisfied: jsonschema>=4.18.0 in /Users/tim/env/lib/python3.9/site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (4.23.0) Requirement already satisfied: fastjsonschema>=2.15 in /Users/tim/env/lib/python3.9/site-packages (from nbformat>=5.7->nbconvert->jupyter->-r ../requirements.txt (line 9)) (2.20.0) Requirement already satisfied: wcwidth in /Users/tim/env/lib/python3.9/site-packages (from prompt-toolkit>=3.0.30->jupyter-console->jupyter->-r ../requirements.txt (line 9)) (0.2.13) Requirement already satisfied: argon2-cffi-bindings in /Users/tim/env/lib/python3.9/site-packages (from argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (21.2.0) Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /Users/tim/env/lib/python3.9/site-packages (from botocore<1.35.82,>=1.35.74->aiobotocore<3.0.0,>=2.5.4->s3fs>=2022.11->earthaccess->-r ../requirements.txt (line 14)) (1.0.1) Requirement already satisfied: parso<0.9.0,>=0.8.4 in /Users/tim/env/lib/python3.9/site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (0.8.4) Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /Users/tim/env/lib/python3.9/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2024.10.1) Requirement already satisfied: referencing>=0.28.4 in /Users/tim/env/lib/python3.9/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.35.1) Requirement already satisfied: rpds-py>=0.7.1 in /Users/tim/env/lib/python3.9/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.21.0) Requirement already satisfied: python-json-logger>=2.0.4 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.0.7) Requirement already satisfied: pyyaml>=5.3 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (6.0.2) Requirement already satisfied: rfc3339-validator in /Users/tim/env/lib/python3.9/site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.1.4) Requirement already satisfied: rfc3986-validator>=0.1.1 in /Users/tim/env/lib/python3.9/site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (0.1.1) Requirement already satisfied: ptyprocess>=0.5 in /Users/tim/env/lib/python3.9/site-packages (from pexpect>4.3->ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (0.7.0) Requirement already satisfied: executing>=1.2.0 in /Users/tim/env/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (2.1.0) Requirement already satisfied: asttokens>=2.1.0 in /Users/tim/env/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (2.4.1) Requirement already satisfied: pure-eval in /Users/tim/env/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->-r ../requirements.txt (line 9)) (0.2.3) Requirement already satisfied: fqdn in /Users/tim/env/lib/python3.9/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (1.5.1) Requirement already satisfied: isoduration in /Users/tim/env/lib/python3.9/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (20.11.0) Requirement already satisfied: jsonpointer>1.13 in /Users/tim/env/lib/python3.9/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (3.0.0) Requirement already satisfied: uri-template in /Users/tim/env/lib/python3.9/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (1.3.0) Requirement already satisfied: webcolors>=24.6.0 in /Users/tim/env/lib/python3.9/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (24.11.1) Requirement already satisfied: cffi>=1.0.1 in /Users/tim/env/lib/python3.9/site-packages (from argon2-cffi-bindings->argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (1.17.1) Requirement already satisfied: pycparser in /Users/tim/env/lib/python3.9/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.22) Requirement already satisfied: arrow>=0.15.0 in /Users/tim/env/lib/python3.9/site-packages (from isoduration->jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (1.3.0) Requirement already satisfied: types-python-dateutil>=2.8.10 in /Users/tim/env/lib/python3.9/site-packages (from arrow>=0.15.0->isoduration->jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->-r ../requirements.txt (line 9)) (2.9.0.20241003)
# Dependencies
import os
import gc
import gdown
import numpy as np
import rawpy
import cv2 as cv
import matplotlib.pyplot as plt
# Enable EXR
os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1"
# Global Helper Functions
# Crudely Normalize an Image (float) from 0-1
def normalize(img):
return (img - img.min())/(img.max()-img.min())
# Contrast Stretches an Image (float)
def contrast_stretch(img,min=0,max=1):
return np.clip(normalize(img) * (max-min) + min,a_min=0,a_max=1)
# Convert a uint8/uint16 image to a float image
def int_to_float(img):
return normalize(img.astype(np.float))
# Convert a float image to a uint8 image
def float_to_int(img):
return ((2**8-1)*normalize(img)).astype(np.uint8)
# Convert a float image to a uint16 image
def float_to_int16(img):
return ((2**16-1)*normalize(img)).astype(np.uint16)
# Converts CR2 to Numpy Array
def cr2_to_numpy(cr2Path,uint=False,gamma=(1,1),half_size=True,use_camera_wb=False,no_auto_bright=False):
with rawpy.imread(cr2Path) as raw:
if(uint):
out = raw.postprocess() # uint8
else:
out = raw.postprocess(gamma=gamma,use_camera_wb=use_camera_wb,use_auto_wb=True,no_auto_bright=no_auto_bright,half_size=half_size,output_bps=16,demosaic_algorithm=rawpy.DemosaicAlgorithm.VNG,output_color=rawpy.ColorSpace.sRGB)
out = out.astype(np.float32)/ 2**16
if(out.shape[2] > out.shape[1]): # Vertical, must rotate
out = np.rot90(out,k=3)
return out
# Convert Directory of CR2s into a Tensor
def cr2Dir_to_tensor(stackPath,gamma=(1,1),use_camera_wb=False,half_size=True,no_auto_bright=False,exclude=[]):
stackFiles = sorted([file for file in os.listdir(stackPath) if (file not in exclude) and (file.endswith('.CR2') or file.endswith('.CR3'))])
print(f'Stack Files: {stackFiles}')
print('Stacking Raw Images into a Tensor')
stackedNumpy = np.stack([cr2_to_numpy(f'{stackPath}/{stackFile}',gamma=gamma,use_camera_wb=use_camera_wb,half_size=half_size,no_auto_bright=no_auto_bright) for stackFile in tqdm(stackFiles)])
print(f'Stacked Numpy Shape: {stackedNumpy.shape}')
print(f'Stacked Numpy Data Type: {stackedNumpy.dtype}')
gc.collect()
return stackedNumpy
Downloading the Data¶
For exploring the process of Image Stacking, we will be downloading a "Homework" example from Cory Schmitz's blog in the PhotographSpace site! He takes a really nice shot of the milky way that we can work with. [1]
Here are some logisitcs of the stack, taken on a static tripod:
- Camera: Canon 5D Mark III
- ISO: 6400
- Exposure Length: 15 seconds
- White Balance: 4250K
# Creating Directory to Store the Data
dataDir1 = '../data/imagestacking/photographspace'
os.makedirs(dataDir1,exist_ok=True)
# Downloading the Single Raw Image & Full Stack
site = "https://www.photographingspace.com/downloads/"
singleRawFile = "CSM30803.CR2"
stackFile = "11x_ISO6400_f2.8_15s_5DMkIII_raw.zip"
for file in [singleRawFile,stackFile]:
filePath = f'{dataDir1}/{file}'
if(not(os.path.exists(filePath))):
fileLink = f'{site}/{file}'
os.system(f'curl {fileLink} -o {filePath}')
if(file.endswith('.zip')):
zipDir = filePath.split('.zip')[0]
if(not(os.path.exists(zipDir))):
os.system(f'unzip {filePath} -d {zipDir}')
Visualizing the Data¶
# Extracting Single Raw Image & Viewing
singleRawPath = f'{dataDir1}/{singleRawFile}'
singleRaw = cr2_to_numpy(singleRawPath,use_camera_wb=True)
print(f'Single Raw Numpy Shape: {singleRaw.shape}')
print(f'Single Raw Numpy Data Type: {singleRaw.dtype}')
cv.imwrite(f"{dataDir1}/{singleRawFile.split('.CR2')[0]}.tiff",float_to_int16(singleRaw)[...,::-1])
# Plotting
plt.figure(figsize=(15,10))
plt.title(f'Single Raw: {singleRawFile}')
plt.imshow(contrast_stretch(singleRaw))
plt.axis('off')
plt.show()
Single Raw Numpy Shape: (1935, 2898, 3) Single Raw Numpy Data Type: float64
# Read the Stacks into Memory
stackPath = f'{dataDir1}/11x_ISO6400_f2.8_15s_5DMkIII_raw/raw'
stackFiles = sorted([file for file in os.listdir(stackPath) if file.endswith('.CR2')])
stackedNumpy = cr2Dir_to_tensor(stackPath,use_camera_wb=True)
Stack Files: ['CSM30799.CR2', 'CSM30800.CR2', 'CSM30801.CR2', 'CSM30802.CR2', 'CSM30803.CR2', 'CSM30804.CR2', 'CSM30805.CR2', 'CSM30806.CR2', 'CSM30807.CR2', 'CSM30808.CR2', 'CSM30809.CR2'] Stacking Raw Images into a Tensor
100%|āāāāāāāāāā| 11/11 [00:04<00:00, 2.66it/s]
Stacked Numpy Shape: (11, 1935, 2898, 3) Stacked Numpy Data Type: float64
# Viewing the Stack
rows = 5
cols = 2
fig, ax = plt.subplots(nrows=rows,ncols=cols,figsize=(15,30))
plt.suptitle('Raw Image Stack')
for i in range(rows):
for j in range(cols):
ax[i][j].axis('off')
ax[i][j].set_title(stackFiles[(i*cols)+j])
ax[i][j].imshow(contrast_stretch(stackedNumpy[(i*cols)+j]))
plt.tight_layout()
plt.show()