Filter Ops (live-preview)
Eleven classic filters in one node — including a halftone and a real unsharp mask
- image
- mask
- image
Filter Ops is the grab-bag node of the ComfyUI Channel Ops pack: eleven classic image effects behind one node - Blur, Halftone, Color Filter, Sharpen, Pixelate, Posterize, Vignette, Levels, Color Balance, Laplacian Sharpen, and Unsharp Masking. The pitch is that instead of installing six different post-processing packs, you get the effects that actually get used in one dropdown.
The genuinely useful part isn't the list, though - it's the UI. The node's widgets are adaptive: pick "Vignette" and only the vignette controls appear; pick "Levels" and you get a histogram widget with black/white/gamma handles you can drag. The node author built custom JS widgets (color wheels for Color Filter and Color Balance, a draggable center for the vignette, that histogram) that mirror the underlying numeric values in both directions. So you get the ergonomics of a mini image editor without leaving the graph.
How it works
Like the rest of the pack, everything is pure tensor math - no models, no downloads. The core inputs every effect shares are effect, source, radius, and blend_mode. The pattern is: apply the effect to the channels chosen by source (same RGB/HSV/Oklab channel menu as the pack's Channel Ops node), then optionally blend the result over the original using blend_mode and a mask to restrict the effect to a region.
The effects worth singling out, because they're better than the usual custom-node fare:
- Halftone - 12 shape patterns (Dot, Line, Cross Cut, Random Dots…), Bayer-dithered, with
size,angle(plus an angle wheel widget),contrast,brightness, and aninversetoggle. This is the one people search for a dedicated pack to get; it's here. - Unsharp Masking - the classic
amount/radius/thresholdtriplet, whereamountis a multiplier and the radius is Gaussian. Thethresholdinput is the key to avoiding halo artifacts: it stops the effect from firing on low-contrast areas. - Levels - per-channel (
levels_channelRGB/R/G/B) in/out black/white plusgamma, with the histogram widget. That's a real photo-editing control, not a toy. - Color Balance - three-way shadows/midtones/highlights color wheels. Hue picks the tint direction, how far you drag sets the intensity.
The inputs that matter
You'll set effect and blend_mode (always visible), and the node shows the relevant widgets for your chosen effect automatically. radius is the shared spatial control (blur radius, etc.). The effect-specific widgets - halftone_shape, posterize_levels, vignette_amount, levels_in_black, cb_highlight_red, and friends - are all optional and hidden unless the matching effect is active. mask restricts the effect to a region and is auto-resized to your image.
Output is a single image, straight into Save Image or back into the graph.
Installing
Part of the ComfyUI Channel Ops pack:
- ComfyUI Manager → Install Custom Nodes → search "ComfyUI Channel Ops" → install → restart.
- Or manually:
cd ComfyUI/custom_nodes && git clone https://github.com/L33chKing/ComfyUI_Channel_Ops, then restart.
No extra dependencies (torch/NumPy/PIL - already in ComfyUI), no model files, MIT licensed. Runs fine on CPU.
Gotchas
- The widget-hiding UI means a node can look near-empty on some effects and packed on others - that's intentional, not a bug. If you load an old workflow and see fewer widgets than expected, it's the adaptive UI hiding controls for the currently selected effect.
sharpen_amountgoes negative - negative values soften instead of sharpening. That's a feature (one slider for both directions) that reads as a bug until you know.- Posterize's real dither modes (
dither_mode: Bayer / Random / Floyd-Steinberg / Atkinson) are a nice touch that most post-processing nodes skip - worth using on big flat areas to avoid banding. - Because this is the newest and least-searched node in the pack, its widget set changes between releases faster than the others. If a workflow you downloaded complains about a missing widget, update the pack and re-load.
Inputs (55)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| effect | COMBO | Blur | 11 options: Blur, Halftone, Color Filter, Sharpen, Pixelate, Posterize, +5 |
| radius | INT | 80–200 | — |
| source | COMBO | RGB | 12 options: Red, Green, Blue, Red+Green, Red+Blue, Green+Blue, +6 |
| blend_mode | COMBO | Normal | 21 options: Normal, Multiply, Screen, Overlay, Soft Light, Hard Light, +15 |
| halftone_shapeopt | COMBO | Dot | 12 options: Random Dots, Cross Cut, Dot, Line Scalloped, Line, Line Centered, +6 |
| halftone_inverseopt | BOOLEAN | false | — |
| halftone_sizeopt | INT | 121–100 | — |
| halftone_angleopt | FLOAT | 15.0-180–180 | — |
| halftone_contrastopt | INT | 0-100–100 | — |
| halftone_brightnessopt | INT | 0-100–100 | — |
| halftone_qualityopt | INT | 21–5 | — |
| halftone_ditheropt | INT | 1000–100 | — |
| color_hueopt | INT | 00–360 | — |
| color_densityopt | INT | 1280–255 | — |
| color_preserve_highlightsopt | INT | 500–100 | — |
| color_saturationopt | FLOAT | 1.0000–1 | — |
| sharpen_amountopt | INT | 50-200–200 | — |
| sharpen_radiusopt | INT | 21–20 | — |
| sharpen_thresholdopt | INT | 00–50 | — |
| pixelate_sizeopt | INT | 161–200 | — |
| pixelate_modeopt | COMBO | Pixelate | 2 options: Pixelate, Mosaic |
| posterize_levelsopt | INT | 42–32 | — |
| vignette_amountopt | INT | 50-100–100 | — |
| vignette_sizeopt | INT | 500–100 | — |
| vignette_featheropt | INT | 300–100 | — |
| vignette_roundnessopt | INT | 0-100–100 | — |
| levels_channelopt | COMBO | RGB | 4 options: RGB, Red, Green, Blue |
| levels_in_blackopt | INT | 00–254 | — |
| levels_in_whiteopt | INT | 2551–255 | — |
| levels_gammaopt | FLOAT | 1.000.01–9.99 | — |
| levels_out_blackopt | INT | 00–254 | — |
| levels_out_whiteopt | INT | 2551–255 | — |
| cb_shadow_redopt | INT | 0-100–100 | — |
| cb_shadow_greenopt | INT | 0-100–100 | — |
| cb_shadow_blueopt | INT | 0-100–100 | — |
| cb_midtone_redopt | INT | 0-100–100 | — |
| cb_midtone_greenopt | INT | 0-100–100 | — |
| cb_midtone_blueopt | INT | 0-100–100 | — |
| cb_highlight_redopt | INT | 0-100–100 | — |
| cb_highlight_greenopt | INT | 0-100–100 | — |
| cb_highlight_blueopt | INT | 0-100–100 | — |
| blur_modeopt | COMBO | Gaussian | 3 options: Gaussian, Average, Edge Average |
| posterize_modeopt | COMBO | RGB | 2 options: RGB, Luminance |
| posterize_ditheropt | INT | 00–100 | — |
| vignette_center_xopt | INT | 500–100 | — |
| vignette_center_yopt | INT | 500–100 | — |
| posterize_dither_modeopt | COMBO | None | 5 options: None, Bayer, Random, Floyd-Steinberg, Atkinson |
| laplacian_amountopt | FLOAT | 1.000–5 | — |
| laplacian_kernelopt | COMBO | 3x3 (8-neighbor) | 2 options: 3x3 (4-neighbor), 3x3 (8-neighbor) |
| usm_amountopt | FLOAT | 1.000–5 | — |
| usm_radiusopt | INT | 31–50 | — |
| usm_thresholdopt | INT | 00–255 | — |
| maskopt | MASK | — | |
| preview_idopt | STRING | A | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |