Spaces:
Sleeping
Sleeping
| from pystackreg import StackReg | |
| import numpy as np | |
| import imageio.v2 as iio | |
| from PIL import Image | |
| def get_sr_mode(mode_str): return { | |
| "TRANSLATION": StackReg.TRANSLATION, | |
| "RIGID_BODY": StackReg.RIGID_BODY, | |
| "SCALED_ROTATION": StackReg.SCALED_ROTATION, | |
| "AFFINE": StackReg.AFFINE, | |
| "BILINEAR": StackReg.BILINEAR, | |
| }.get(mode_str, StackReg.RIGID_BODY) | |
| def normalize_stack(stack): | |
| norm_stack = [] | |
| for frame in stack: | |
| f = frame.astype(np.float32) | |
| low, high = np.percentile(f, (1, 99)) | |
| f = np.clip(f, low, high) | |
| f = (f - f.min()) / (np.ptp(f) + 1e-8) * 255 if np.ptp(f) > 0 else np.zeros_like(f) | |
| norm_stack.append(f.astype(np.uint8)) | |
| return np.stack(norm_stack) | |
| def upscale(image, factor=3): | |
| return image.resize((image.width * factor, image.height * factor), Image.NEAREST) | |
| def load_stack(file): | |
| stack = np.array(iio.mimread(file)) | |
| if stack.ndim == 4 and stack.shape[-1] == 3: | |
| stack = np.mean(stack, axis=-1) | |
| return normalize_stack(stack) | |
| ##### Markdowns ##### | |
| citation_markdown = """ | |
| ### 📘 Credits & Acknowledgments | |
| Register TIFF stacks using multiple alignment strategies. | |
| **App Author**: [Quentin Chappuis](https://github.com/qchapp) | |
| **Pystackreg Author**: [Gregor Lichtenberg](https://github.com/glichtner) | |
| 🔗 [Pystackreg on GitHub](https://github.com/glichtner/pystackreg) | |
| **Original Algorithm Author**: Philippe Thévenaz (EPFL) | |
| The core algorithm was originally developed by Philippe Thévenaz and is described in the following publication: | |
| > P. Thévenaz, U.E. Ruttimann, M. Unser | |
| > *A Pyramid Approach to Subpixel Registration Based on Intensity* | |
| > *IEEE Transactions on Image Processing*, vol. 7, no. 1, pp. 27–41, January 1998. | |
| > 🔗 [View paper](http://bigwww.epfl.ch/publications/thevenaz9801.html) | |
| """ | |
| documentation_markdown = """ | |
| ### Overview | |
| This app provides three registration modes for 2D TIFF image stacks using the `pystackreg` library. | |
| --- | |
| ### 📚 Tab 1: Reference-Based Alignment | |
| Register a stack using a reference frame. You can: | |
| - Use a frame from the **same stack** as reference | |
| - Or upload an **external reference stack** | |
| 1. Upload the stack you want to align. | |
| 2. (Optional) Check "Use external reference stack" to align to a frame from another file. | |
| 3. Choose the reference frame using the slider. | |
| 4. (Optional) Choose transformation mode. | |
| 5. Click **▶️ Align Stack**. | |
| 6. Use sliders to browse original/aligned results and download the output. | |
| --- | |
| ### 🎯 Tab 2: Stack-Based Alignment | |
| Align one stack (moving) to another (reference). | |
| 1. Upload both **reference** and **moving** stacks. | |
| 2. (Optional) Choose transformation mode. | |
| 3. Click **▶️ Register** to align. | |
| 4. Browse and download registered stack. | |
| --- | |
| ### 🧩 Tab 3: Frame-to-Frame Alignment | |
| Align a **single frame to another** from the same stack. | |
| 1. Upload a stack. | |
| 2. Select **reference** and **moving** frames using sliders. | |
| 3. Choose transformation mode. | |
| 4. Click **▶️ Register Frame**. | |
| 5. View/download the result. | |
| --- | |
| ### 🔄 Reset Buttons | |
| Each tab includes a **Reset Tab** button that clears inputs, outputs, and internal state. | |
| --- | |
| ### 🧠 Credits | |
| App developed by **Quentin Chapuis** | |
| Library: [`pystackreg`](https://github.com/glichtner/pystackreg) by **Georg Lichtenberg** | |
| """ |