π Kraken Image Processor
The clean-up pass before and after your upscale, all in one node
- image_input
- processed_image
- processing_log
- quality_metrics
There's a version of upscaling where you drag in an image, run an upscaler, and accept whatever comes out. There's a better one where you de-noise the source first, upscale, then sharpen and regrade the result. π Kraken Image Processor is the second workflow, wrapped into a single node with a processing_mode switch that changes what it does depending on where it sits in the graph.
It's part of Kraken Tools (krakenunbound/comfyui-kraken-tools), the pack's image pipeline front-and-center: the README's recommended flow is USDU upscale β Kraken Resolution Helper β this node β Save. The idea is that you don't need five separate filter nodes cluttering the canvas - one node with honest toggles does denoise, contrast, sharpen, color, and optional film grain, and tells you what it did.
How it works
Everything is toggle-gated, and the tooltips are the author's own descriptions, so they're trustworthy. The inputs that actually matter:
- processing_mode -
pre_processorpost_process. Pre-process prepares the source for upscaling (noise removal so the upscaler doesn't amplify artifacts); post-process refines the output. The same toggles apply gentler default behavior in post mode. - source_mode -
upload(use a file picker) orupstream(accept animage_inputfrom the graph). You'll almost always useupstreamin a workflow. - enable_denoising + denoise_method - the filter behind it:
bilateral(edge-preserving, the default),gaussian(fast),gaussian_torch(GPU-accelerated),median(good for JPEG artifacts), ornon_local_means(heavy, for genuinely noisy photos).denoise_strength1.0 is normal; above that is aggressive. - enable_contrast_enhancement - with
auto_contrastfor the lazy option, or manualcontrast_factor/brightness_factor(1.0 = no change). - enable_pre_sharpening -
unsharp_mask(professional),edge_enhance(simple), orcustom_kernelwhere you paste a 3x3 kernel like0,-1,0;-1,5,-1;0,-1,0intocustom_sharpen_kernel.sharpening_strength0.3 is subtle, 1.0 is strong;sharpening_radiussmall = fine detail, large = broader. - enable_color_correction - saturation and gamma, for faded source material.
- enable_film_grain - post-processing only, per the tooltip:
grain_amount0.05 (subtle) to 0.5 (strong),grain_size1.0 fine to 3.0 coarse. This is a texture finish, not a fix. - preserve_alpha - keeps transparency through the pipeline if the source has it.
- processing_precision -
8bitor16bit. 16-bit is higher quality and slower, the "don't round-trip through 8-bit before the upscaler sees it" choice.
Outputs
- processed_image (IMAGE) β your upscaler or Save node.
- processing_log (STRING) - what actually ran, for a text display.
- quality_metrics (STRING) - a metrics report (sharpness/noise estimates) you can inspect instead of trusting your eyes.
Install
Part of the pack, standard install. ComfyUI Manager β search "Kraken Tools" β Install β restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/krakenunbound/comfyui-kraken-tools
cd comfyui-kraken-tools
pip install -r requirements.txt
The pack pulls in opencv-python and scipy - that's where the denoise/sharpen machinery comes from. ComfyUI Manager will handle those deps; on a manual install make sure they're present or the node's imports will fail.
Where people get burned
- Stacking everything on. Every toggle on at 16-bit on a 4K source is slow for no reason. Denoise + light sharpen pre, gentle sharpen + grain post, and turn the rest off until you know you need it.
- Grain in pre-process does nothing.
enable_film_grainis gated to post-processing by design; if you flip it on in pre mode it's ignored, which confuses people for exactly one workflow. - Non-local means is a time sink. It's the "real" denoiser but it's dramatically slower than bilateral. On anything above 1MP, treat it as a deliberate choice, not a default.
- Upscaling amplifies everything. The whole point of the pre-pass is that an upscaler faithfully upscales your noise and halos along with your image. If you've been fighting "why does my upscale look gritty," the answer is usually that the source needed this node before the upscaler ever ran.
This is one of those nodes you don't need every day - until you're upscaling a phone photo or a JPEG that's been compressed twice, and suddenly it's the whole difference between "bigger" and "better."
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| processing_mode | COMBO | pre_process | Pre-process: Prepare image for upscaling | Post-process: Refine upscaled image |
| source_mode | COMBO | upstream | Upload: use uploaded image | Upstream: receive from connected node |
| image_upload | COMBO | Select uploaded image (only used when source_mode = upload) | |
| enable_denoising | BOOLEAN | true | Remove noise/artifacts (recommended for pre-processing) |
| denoise_method | COMBO | bilateral | bilateral (edge-preserving) | gaussian (fast) | gaussian_torch (GPU) | median (JPEG artifacts) | non_local_means (heavy) |
| denoise_strength | FLOAT | 0.300.1β3 | Denoising intensity (1.0 = normal, higher = aggressive) |
| enable_contrast_enhancement | BOOLEAN | true | Optimize contrast and brightness for detail visibility |
| auto_contrast | BOOLEAN | false | Automatically optimize contrast range |
| contrast_factor | FLOAT | 1.050.5β2 | Manual contrast adjustment (1.0 = no change) |
| brightness_factor | FLOAT | 1.100.5β1.5 | Brightness adjustment (1.0 = no change) |
| enable_pre_sharpening | BOOLEAN | true | Sharpen edges (pre: before upscale, post: subtle refinement) |
| sharpening_method | COMBO | unsharp_mask | unsharp_mask (professional) | edge_enhance (simple) | custom_kernel (advanced) |
| sharpening_strength | FLOAT | 0.500β2 | Sharpening intensity (0.3 = subtle, 1.0 = strong) |
| sharpening_radius | FLOAT | 0.900.5β3 | Sharpening radius (smaller = fine detail, larger = broader) |
| enable_color_correction | BOOLEAN | false | Apply color corrections (useful for faded/poor colors) |
| color_saturation | FLOAT | 1.050β2 | Color saturation (1.0 = normal, >1.0 = vibrant) |
| gamma_correction | FLOAT | 1.100.5β2 | Gamma correction (1.0 = normal, <1.0 = brighter) |
| enable_film_grain | BOOLEAN | false | Add film grain for artistic texture (post-processing only) |
| grain_amount | FLOAT | 0.050β0.5 | Grain intensity (0.05 = subtle, 0.5 = strong) |
| grain_size | FLOAT | 1.000.5β3 | Grain size (1.0 = fine, 3.0 = coarse) |
| preserve_alpha | BOOLEAN | true | Preserve transparency channel if present |
| processing_precision | COMBO | 16bit | Processing bit depth (16bit = higher quality, slower) |
| image_inputopt | IMAGE | Input image from upstream node (used if source_mode = upstream) | |
| custom_sharpen_kernelopt | STRING | 0,-1,0;-1,5,-1;0,-1,0 | Custom sharpening kernel (format: row1;row2;row3) |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| processed_image | IMAGE | β |
| processing_log | STRING | β |
| quality_metrics | STRING | β |