Back to skills
SKILL.md
Nuke Tiling Tool
ASecurityAutomated image tiling for ML processing in Nuke with seamless gradient blending. Use for large plates (4K+) through ML nodes (ViTMatte) optimized for 1K-2K tiles.
- 6 stars
- 0 votes
- 0 copies
- 5 views
- Added September 3, 2026
Works with
Security analysis
100/100Pro scans all 6 files and shows the line behind each finding
npx -y skills add sideshowroberto/vfx-agent-toolkit --skill nuke-tiling-tool --agent claude-codeAre you the author of Nuke Tiling Tool?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/sideshowroberto-nuke-tiling-tool)---
name: nuke-tiling-tool
description: Automated image tiling for ML processing in Nuke with seamless gradient blending. Use for large plates (4K+) through ML nodes (ViTMatte) optimized for 1K-2K tiles.
allowed-tools: Read,Write,Bash
---
# Nuke Auto-Tiling Tool for ML Processing
**Version:** 1.0.0
**Last Updated:** 2026-01-21
**Status:** Production-ready
**Dependencies:** Nuke 13.2v8+, auto_tile_processor.py
---
## Purpose
Automatically tiles large images for processing through ML nodes (ViTMatte, etc.) that work best with smaller image sizes (1K-2K), then seamlessly blends the results back together using expression-based gradient masks.
## When to Use This Skill
**Trigger phrases:**
- "tile image for ML processing"
- "split large image into tiles"
- "process image through ViTMatte in tiles"
- "auto-tile for machine learning"
- "create tiling setup"
**Use cases:**
- Processing large plates (4K, 5K, 8K) through ML nodes optimized for 1K-2K
- ViTMatte alpha generation on high-resolution images
- Any GPU-intensive node that performs better on smaller images
- Avoiding memory issues with ML inference
## What It Does
### Automated Workflow
```
Input Image (e.g., 5760x5760)
v
Dot distribution (horizontal row)
v
Auto-calculate grid (e.g., 3x3 for 2K tiles)
v
For each tile (vertical stack):
Transform (translate to position)
-> Reformat (crop to tile size)
-> NoOp Placeholder (orange - swap for ML node)
-> Expression (gradient mask -> mask channel)
-> Premult (multiply by mask.a)
-> InverseTransform (restore position)
v
Merge all tiles (plus operation, rgba output)
v
Final Reformat (back to original dimensions)
v
Output (full resolution, seamless blending)
```
### Key Features
1. **Auto-calculates grid dimensions**
- 5760x5760 with 2K tiles -> 3x3 grid
- 8192x8192 with 2K tiles -> 5x5 grid
- Non-square images supported
2. **Expression-based gradient masks**
- Smooth falloff at tile edges (no blur, preserves detail)
- 128px overlap with automatic blending
- Edge/corner tiles handled correctly
3. **Flexible tile sizes**
- 1K (1024x1024)
- 2K (2048x2048)
4. **Clean node organization**
- Horizontal tile layout (Nuke-standard)
- Vertical node stacks per tile
- Clear naming (Transform_Tile_X_Y, etc.)
- Orange NoOp placeholders for ML node insertion
- Dynamic positioning from input node location
## Usage
### Method 1: W_hotbox Buttons (Recommended)
**For 2K tiles (2048x2048):**
```python
import sys
sys.path.insert(0, '<workspace>/.claude/skills/nuke-tiling-tool/scripts')
execfile('<workspace>/.claude/skills/nuke-tiling-tool/scripts/auto_tile_processor_2k.py')
```
**For 1K tiles (1024x1024):**
```python
import sys
sys.path.insert(0, '<workspace>/.claude/skills/nuke-tiling-tool/scripts')
execfile('<workspace>/.claude/skills/nuke-tiling-tool/scripts/auto_tile_processor_1k.py')
```
### Method 2: Nuke Script Editor (Direct)
```python
# Select a Read node in Nuke, then run:
import sys
sys.path.append('<workspace>/.claude/skills/nuke-tiling-tool/scripts')
from auto_tile_processor import create_tiling_setup
# For 2K tiles
result = create_tiling_setup(tile_size='2K', overlap=128)
# For 1K tiles
# result = create_tiling_setup(tile_size='1K', overlap=128)
if result['status'] == 'success':
print(f"Created {result['tile_count']} tiles")
print(f"Grid: {result['grid'][0]}x{result['grid'][1]}")
# Now find orange NoOp nodes named "MLNode_Tile_X_Y" and replace with your ML node
```
### Method 2: Via Nuke MCP (Recommended)
```python
# From Claude Code via Nuke MCP
import sys
sys.path.append('<workspace>/.claude/skills/nuke-tiling-tool/scripts')
from auto_tile_processor import create_tiling_setup_with_logger
# Will use NukeMCPLogger for proper status reporting
result = create_tiling_setup_with_logger(tile_size='2K')
```
### Method 3: Natural Language (via Claude)
Just say:
- "Create tiling setup for this image using 2K tiles"
- "Tile this 5760x5760 plate for ViTMatte processing"
- "Set up auto-tiling with 1K tiles"
Claude will invoke this skill automatically.
## Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `input_node` | nuke.Node | Selected node | Input image node to tile |
| `tile_size` | str | `'2K'` | Tile size: `'1K'` or `'2K'` |
| `overlap` | int | `128` | Overlap between tiles in pixels |
## Output
The script creates:
1. **Distribution Layer**:
- Dot nodes in horizontal row (one per tile)
- Positioned below input node
2. **Tile Branches** (one per tile, vertical stacks):
- Transform node (translate to tile position)
- Reformat node (crop to tile size using "to box")
- NoOp placeholder (orange, replace with ML node)
- Expression node (gradient mask -> mask channel)
- Premult node (multiply by mask.a to apply blending)
- InverseTransform node (restore to original position)
3. **Merge Tree**:
- Merge2 nodes (plus operation, rgba output)
- Sequential merging from left to right
4. **Final Reformat**:
- Restores original input dimensions
- Uses "to box" type
- Resize set to 'none'
- Ready for viewer connection
## Example: ViTMatte Processing
```
Original manual workflow:
- 5760x5760 plate
- Manually create 9 tiles
- 9 ViTMatte nodes
- Manually merge with overlap
Automated workflow with this tool:
1. Select Read node (5760x5760 plate)
2. Run: create_tiling_setup(tile_size='2K')
3. Find 9 Group nodes: MLNode_Tile_0_0, MLNode_Tile_0_1, ..., MLNode_Tile_2_2
4. Replace each Group with ViTMatte node (copy settings from first)
5. Done - seamless blending automatically handled
```
## Technical Details
### Grid Calculation
```python
effective_step = tile_size - overlap
grid_x = ceil(image_width / effective_step)
grid_y = ceil(image_height / effective_step)
```
**Examples:**
- 5760x5760, 2K tile, 128 overlap:
- Step = 2048 - 128 = 1920
- Grid = ceil(5760 / 1920) = 3x3
- 8192x8192, 2K tile, 128 overlap:
- Grid = ceil(8192 / 1920) = 5x5
### Expression Mask Logic
**Critical Pattern:** Frame edges stay SHARP, interior tile boundaries BLEND smoothly.
For each tile, an Expression node creates a gradient mask outputting to the **mask** channel:
```python
# X direction (horizontal):
if tile_x == 0: # Leftmost column
smoothstep(0, 128, x) # Only fade IN from left
elif tile_x == grid_x - 1: # Rightmost column
smoothstep(2048, 1920, x) # Only fade OUT to right
else: # Middle columns
smoothstep(0, 128, x) * smoothstep(2048, 1920, x) # Both edges
# Y direction (vertical): same pattern
if tile_y == 0: # Top row
smoothstep(0, 128, y)
elif tile_y == grid_y - 1: # Bottom row
smoothstep(2048, 1920, y)
else: # Middle rows
smoothstep(0, 128, y) * smoothstep(2048, 1920, y)
```
**Examples for 3x3 grid:**
- **Tile (0,0) top-left**: `smoothstep(0, 128, x) * smoothstep(0, 128, y)` - only interior edges fade
- **Tile (1,1) center**: All four edges fade (both x and y directions)
- **Tile (2,2) bottom-right**: `smoothstep(2048, 1920, x) * smoothstep(2048, 1920, y)` - only interior edges fade
**Result:**
- Frame boundaries: Sharp (no fade) [OK]
- Interior tile boundaries: Smooth gradient blend [OK]
- Works for any aspect ratio (grid auto-adjusts) [OK]
### Blending Strategy
**Why expression masks, not blur?**
| Approach | Alpha Quality | Blend Quality | Efficiency |
|----------|---------------|---------------|------------|
| Blur alpha | [FAIL] Destroys detail | [OK] Smooth | [WARN] Per-frame |
| Expression masks | [OK] Sharp detail | [OK] Smooth | [OK] Single eval, cached |
**Key insight:** Blend the tile CONTRIBUTIONS (with masks), not the alpha VALUES (with blur).
## Troubleshooting
### "No node selected"
**Solution:** Select a Read node or any image node before running the script.
### "Image too small for tiling"
**Solution:** If your image is smaller than the tile size, you don't need tiling. Process directly with your ML node.
### "Visible seams in output"
**Possible causes:**
1. ML node produces inconsistent results across tiles
- Solution: Ensure ML node settings are identical across all tiles
2. Overlap too small
- Solution: Increase overlap parameter (try 256 instead of 128)
### "Script not found"
**Solution:** Ensure the script path is correct:
```python
sys.path.append('<workspace>/.claude/skills/nuke-tiling-tool/scripts')
```
## Node Naming Convention
All nodes follow this pattern:
- Transform: `Transform_Tile_X_Y`
- Reformat: `Reformat_Tile_X_Y`
- Placeholder: `MLNode_Tile_X_Y` (replace this with your ML node)
- InverseTransform: `InverseTransform_Tile_X_Y`
- Mask: `TileMask_X_Y`
- Copy: `ApplyMask_X_Y`
- Merge: `Merge_Tile_X_Y`
Where X = column index, Y = row index (0-indexed)
## Performance Considerations
### Grid Size vs Processing Time
| Input Size | Tile Size | Grid | Tiles | Processing Time (relative) |
|------------|-----------|------|-------|----------------------------|
| 5760x5760 | 2K | 3x3 | 9 | 1x |
| 5760x5760 | 1K | 6x6 | 36 | 4x (more tiles, more overhead) |
| 8192x8192 | 2K | 5x5 | 25 | 2.7x |
**Recommendation:** Use 2K tiles unless your ML node requires 1K.
### Memory Usage
Each tile is processed independently, so peak memory = single tile processing memory.
**Example:**
- Original: 5760x5760 image through ViTMatte = ~1.2GB VRAM
- Tiled (2K): Each 2048x2048 tile through ViTMatte = ~150MB VRAM
- **Result:** 8x reduction in peak memory usage
## Validation
### Test Cases
1. **5760x5760 -> 2K tiles**
- Expected: 3x3 grid (9 tiles)
- Verify: No visible seams in output
2. **8192x8192 -> 2K tiles**
- Expected: 5x5 grid (25 tiles)
- Verify: Grid calculation correct
3. **Non-square: 7680x4320 -> 2K tiles**
- Expected: 4x3 grid (12 tiles)
- Verify: Non-square grids handled correctly
4. **Small image: 1920x1080 with 2K tiles**
- Expected: Error message (image too small)
- Verify: Graceful handling
## Integration with VFX Pipeline
### Batch Processing
For multiple shots:
```python
shots = [
{'read_path': 'shot001.exr', 'output': 'shot001_alpha.exr'},
{'read_path': 'shot002.exr', 'output': 'shot002_alpha.exr'},
]
for shot in shots:
# Clear script
nuke.scriptClear()
# Create Read node
read = nuke.createNode('Read')
read['file'].setValue(shot['read_path'])
# Create tiling setup
result = create_tiling_setup(input_node=read, tile_size='2K')
# TODO: Insert ML nodes into placeholders
# TODO: Render output
```
### Gizmo Export (Future Enhancement)
Once the setup is working, you can save it as a Gizmo for reuse:
1. Run the script with your ML node integrated
2. Select all nodes
3. Copy to clipboard
4. Create Gizmo template
## Constitutional Compliance
This skill follows VFX Skill Constitution principles:
- **Article I (General Purpose):** Works with ANY image size, project, shot
- **Article III (Progressive Disclosure):** <500 lines in SKILL.md, detailed implementation in separate .py file
- **Article IV (Independent Testing):** Script can be run standalone in Nuke Script Editor
- **Article V (Official Patterns):** Uses standard Nuke nodes (Transform, Reformat, Expression, Merge2)
- **Article VI (Context Efficiency):** Skill metadata ~50 lines, full implementation 600 lines (separate file)
## Version History
- **1.0.0** (2026-01-21): Initial release
- Auto grid calculation
- Expression-based gradient masks
- 1K and 2K tile support
- NukeMCPLogger integration
## References
- Main script: `.claude/skills/nuke-tiling-tool/scripts/auto_tile_processor.py`
- NukeMCPLogger: `~/.nuke\nuke_mcp_logger.py`
- Nuke standards: `ClaudeCode/agent-os/profiles/vfx/standards/nuke-standards.md`
## Credits
Created by Claude Code for automated ML image processing workflows in Nuke.
Files in this skill
- INSTALLATION.md
- README.md
- SKILL.md
- scripts/auto_tile_processor.py
- scripts/auto_tile_processor_1k.py
- scripts/auto_tile_processor_2k.py
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.