Engine rewrite: - Remove fake Display P3 stage (sRGB->XYZ->P3 round-trip was a no-op hiding a plain saturation multiply) and redundant strength multipliers - Fix box blur: was a trailing window shifted diagonally with zero-padded borders; now centered with edge replication - Fix non-monotonic highlight soft-clip (banding above white) - White balance and tone mapping in linear light (luminance-preserving) - Smart HDR: Durand-style log-luminance base/detail local tone mapping - Color science in Oklab: hue-preserving vibrance, real skin-tone protection mask, subtle split-tone signature - Single two-scale detail stage (texture + clarity) with tanh halo suppression, replacing three overlapping sharpeners - Photon-weighted grain, natural-falloff vignette in linear light - 15 iPhone 17 Photographic Styles presets (moods + undertones + B&W) - Delete dead camera_profiles.py LUT engine: tetrahedral interpolation (industry standard) with chunked memory-safe application; document that the Apple Log LUT expects log input UI: rebuild for new params; sizing via getMinHeight/getMaxHeight + computeSize (no more guessed heights), remount safety net for workflow reload store clears, sanitize values restored by position from old saves Tests: 16-case suite covering blur centering, Oklab round-trip, styles, skin protection, tetrahedral exactness, node API Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
182 lines
7.2 KiB
Markdown
182 lines
7.2 KiB
Markdown
# 📷 Camera Forensic Realism Engine v4
|
||
|
||
Makes AI-generated images look like they were shot on an **iPhone 17** by emulating Apple's ISP color pipeline — with honest, physically-grounded color science.
|
||
|
||
> No placebo sliders. Every stage in v4 does real, verifiable work: white balance and tone mapping in linear light, local HDR in log-luminance, color rendering in Oklab, and tetrahedral LUT interpolation.
|
||
|
||
---
|
||
|
||
## ✨ Processing Stages
|
||
|
||
| # | Stage | What It Does |
|
||
|---|-------|-------------|
|
||
| 1 | **White Balance** | Channel gains in **linear light**, luminance-preserving (warming doesn't brighten) |
|
||
| 2 | **Global Tone** | Exposure, shadow lift, midtone contrast around the 0.18 pivot, Reinhard highlight rolloff |
|
||
| 3 | **Smart HDR** | Durand-style local tone mapping in log-luminance — shadows up, highlights down, detail untouched |
|
||
| 4 | **Color Science** | **Oklab** rendering: hue-preserving vibrance, real skin protection, iPhone split-tone (cool shadows / warm highlights) |
|
||
| 5 | **Detail** | Single two-scale stage (texture + clarity) with tanh halo suppression, luminance-only |
|
||
| 6 | **Optics & Sensor** | Natural 1/(1+kr²)² vignette in linear light + photon-weighted grain |
|
||
|
||
Plus **14 iPhone 17 Photographic Styles** presets (undertones + moods) applied as offsets on top of your sliders.
|
||
|
||
### What changed from v2/v3
|
||
|
||
- ❌ **Removed the fake "Display P3" stage** — it converted sRGB→XYZ→P3 and back (a mathematical no-op) and the only real effect was a plain saturation multiply. Replaced with genuine Oklab vibrance.
|
||
- ❌ **Removed redundant multiplier sliders** (`wb_strength`, `tone_strength`, `sensor_strength`) — `master_strength` is now the one honest mix control.
|
||
- ❌ **Merged three overlapping sharpeners** (detail boost / Deep Fusion / ISP sharpening) into one coherent detail stage.
|
||
- 🐛 **Fixed the box blur** used by HDR and sharpening — it was a trailing window that shifted every blur diagonally and darkened the top/left borders.
|
||
- 🐛 **Fixed the non-monotonic highlight clip** that could cause banding above white.
|
||
- ✅ Skin handling is now an actual protection mask (Oklab hue ≈ 50°, plausible chroma/lightness) instead of a brightness filter on every warm pixel.
|
||
|
||
---
|
||
|
||
## 🚀 Installation
|
||
|
||
### Option 1: Git Clone (Recommended)
|
||
|
||
```bash
|
||
cd ComfyUI/custom_nodes
|
||
git clone https://github.com/MONKEYFOREVER2/ComfyUI-CameraForensicRealism.git
|
||
cd ComfyUI-CameraForensicRealism
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
Restart ComfyUI.
|
||
|
||
### Option 2: Manual Download
|
||
|
||
1. Click the green **Code** button → **Download ZIP**
|
||
2. Extract into `ComfyUI/custom_nodes/` as `ComfyUI-CameraForensicRealism`
|
||
3. `pip install -r requirements.txt`
|
||
4. Restart ComfyUI
|
||
|
||
---
|
||
|
||
## 🎯 Finding the Node
|
||
|
||
**Right-click** → **Add Node** → **image/forensic** → **📷 Camera Forensic Realism (iPhone 17)**
|
||
|
||
## ⚡ Quick Start
|
||
|
||
1. Place the node **after** your detailers/post-processing and **before** SaveImage
|
||
2. Pick a **Photographic Style** (start with `Standard`)
|
||
3. Defaults are tuned for the iPhone 17 look — adjust to taste
|
||
|
||
```
|
||
[Generate] → [Upscale] → [FaceDetailer] → [📷 Camera Forensic Realism] → [SaveImage]
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Parameters
|
||
|
||
### Master
|
||
| Parameter | Default | Description |
|
||
|-----------|---------|-------------|
|
||
| `photographic_style` | `Standard` | iPhone 17 Photographic Style preset (see below) |
|
||
| `master_strength` | `0.85` | Final blend between original and processed image |
|
||
| `seed` | `0` | Grain reproducibility |
|
||
|
||
### Photographic Styles
|
||
|
||
**Moods:** `Standard`, `Natural`, `Luminous`, `Vibrant`, `Dramatic`, `Quiet`, `Cozy`, `Ethereal`, `Muted B&W`, `Stark B&W`
|
||
**Undertones:** `Amber`, `Gold`, `Rose Gold`, `Cool Rose`, `Neutral`
|
||
|
||
Styles are applied as offsets on top of your slider values, mirroring how Apple's 2nd-gen Photographic Styles re-tune the same pipeline.
|
||
|
||
### White Balance
|
||
| Parameter | Default | Description |
|
||
|-----------|---------|-------------|
|
||
| `enable_white_balance` | `True` | Linear-light channel gains, luminance-preserving |
|
||
| `wb_temperature` | `0.12` | Cool (blue) ← → Warm (orange). iPhone AWB ≈ 0.1–0.15 |
|
||
| `wb_tint` | `0.0` | Green ← → Magenta |
|
||
|
||
### Global Tone
|
||
| Parameter | Default | Description |
|
||
|-----------|---------|-------------|
|
||
| `enable_tone` | `True` | Linear-light tone mapping |
|
||
| `exposure` | `0.05` | EV adjustment — iPhone meters slightly bright |
|
||
| `contrast` | `0.15` | Midtone contrast around the 0.18 photographic pivot |
|
||
| `shadows` | `0.35` | Luminance-masked shadow lift + tiny black-point lift |
|
||
| `highlights` | `0.5` | Reinhard soft-knee rolloff — smooth, monotonic, never clips |
|
||
|
||
### Smart HDR
|
||
| Parameter | Default | Description |
|
||
|-----------|---------|-------------|
|
||
| `enable_smart_hdr` | `True` | Local tone mapping in log-luminance |
|
||
| `hdr_strength` | `0.35` | Local dynamic range compression amount |
|
||
|
||
### Color Science (Oklab)
|
||
| Parameter | Default | Description |
|
||
|-----------|---------|-------------|
|
||
| `enable_color` | `True` | Perceptual color rendering |
|
||
| `vibrance` | `0.4` | Smart saturation — boosts muted colors more, hue-preserving |
|
||
| `skin_protection` | `0.7` | Shields skin from vibrance + caps skin chroma (no orange faces) |
|
||
| `shadow_tint` | `0.25` | Subtle cool/blue shadows — the iPhone blue-black signature |
|
||
| `highlight_warmth` | `0.2` | Golden warmth in highlights |
|
||
|
||
### Detail
|
||
| Parameter | Default | Description |
|
||
|-----------|---------|-------------|
|
||
| `enable_detail` | `True` | Two-scale luminance detail, halo-suppressed |
|
||
| `texture` | `0.35` | Fine scale (~1px): pores, fabric, hair |
|
||
| `clarity` | `0.2` | Mid scale (~2% of frame): local punch |
|
||
|
||
### Optics & Sensor
|
||
| Parameter | Default | Description |
|
||
|-----------|---------|-------------|
|
||
| `enable_optics` | `True` | Vignette + grain |
|
||
| `grain` | `0.2` | Photon-weighted noise, stronger in shadows |
|
||
| `vignette` | `0.25` | Natural falloff in linear light — iPhone is well-corrected, keep low |
|
||
|
||
---
|
||
|
||
## 🎨 LUT Nodes
|
||
|
||
Two dedicated nodes for applying `.cube` 3D LUTs with **tetrahedral interpolation** (the industry-standard method used by Resolve and camera ISPs — more accurate than trilinear, especially on the neutral axis).
|
||
|
||
### Recommended settings
|
||
|
||
I recommend setting the strength to around 0.05 to 0.10
|
||
|
||
```
|
||
[🎨 LUT Loader] → [🎨 LUT Apply] → [SaveImage]
|
||
↑
|
||
[Your Image]
|
||
```
|
||
|
||
### 🎨 LUT Loader
|
||
| Parameter | Description |
|
||
|-----------|-------------|
|
||
| `lut_name` | Dropdown of `.cube` files from the `luts/` folder |
|
||
|
||
### 🎨 LUT Apply
|
||
| Parameter | Default | Description |
|
||
|-----------|---------|-------------|
|
||
| `strength` | `0.85` | 0.0 = original, 1.0 = full LUT |
|
||
|
||
### Bundled LUTs
|
||
|
||
| File | Type | Correct input |
|
||
|------|------|--------------|
|
||
| `AppleLog2_to_Rec709_33_Grid.cube` | Technical conversion | **Apple Log footage only** — do *not* apply to regular sRGB images |
|
||
| `Presetpro - Portra 800.cube` | Creative film look | Regular sRGB images |
|
||
|
||
Drop your own `.cube` files into `luts/` and restart ComfyUI.
|
||
|
||
---
|
||
|
||
## 📋 Requirements
|
||
|
||
- **ComfyUI** (latest version recommended)
|
||
- **Python 3.10+**
|
||
- **numpy** and **torch** (already included with ComfyUI)
|
||
|
||
## 🤝 Contributing
|
||
|
||
Pull requests are welcome — new Photographic Style tunings, LUTs, or pipeline improvements.
|
||
|
||
## 📄 License
|
||
|
||
MIT License — free to use, modify, and distribute.
|